Toast 在通知欄關閉時不顯示

2021-09-29 05:53:26 字數 2858 閱讀 9015

toast 在應用關閉通知顯示時,某些手機上會不在顯示toast;

原因簡單的說就是toast使用了通知管理器inotificationmanager類,而此類因為禁止了通知欄許可權而不顯示toast; 有興趣的可以追下原始碼;

重點說下3種解決方法把:

var check_op_no_throw: string = "checkopnothrow"

var op_post_notification: string = "op_post_notification"

fun isnotificationenabled(): boolean else if (build.version.sdk_int >= build.version_codes.kitkat) catch (e: exception)

}return true

}

如 自定義toast解決通知欄關閉

見 showsystemtoast

/**

* 顯示系統toast

*/private static void showsystemtoast(toast toast), new invocationhandler()

return method.invoke(inotificationmanager, args);

}});

field sservicefiled = toast.class.getdeclaredfield("sservice");

sservicefiled.setaccessible(true);

sservicefiled.set(null, inotificationmanagerproxy);

toast.show();

}catch (exception e)

}

個人偏向第三種動態**的方案,具體使用判斷是否開啟通知欄許可權使用第一種或者第三種方案;

記錄下toast為什麼打不開的原因吧, read the **** source code ~

--------------------------------toast 的 show方法----------------------------

最終獲取 `notificationmanagerservice` service;

/*** show the view for the specified duration.

*/public void show()

inotificationmanager service = getservice();

string pkg = mcontext.getoppackagename();

tn tn = mtn;

tn.mnextview = mnextview;

try catch (remoteexception e)

}static private inotificationmanager getservice()

sservice = inotificationmanager.stub.asinte***ce(servicemanager.getservice("notification"));

return sservice;

}---------------------notificationmanagerservice 的 enqueuetoast 方法----------------------

public void enqueuetoast(string pkg, itransientnotification callback, int duration)

if (pkg == null || callback == null)

//通過動態**更改了包名為android後,issystemtoasta為true,可規避下面的reture;

final boolean issystemtoast = iscallersystem() || ("android".equals(pkg));

final boolean ispackagesuspended = ispackagesuspendedforuser(pkg, binder.getcallinguid());

//此行會根據包名判斷通知欄的許可權是否禁用;

if (enable_blocked_toasts && (!notenotificationop(pkg, binder.getcallinguid())

|| ispackagesuspended))

}synchronized (mtoastqueue) else }}

}record = new toastrecord(callingpid, pkg, callback, duration);

mtoastqueue.add(record);

index = mtoastqueue.size() - 1;

keepprocessalivelocked(callingpid);

}// if it's at index 0, it's the current toast. it doesn't matter if it's

// new or just been updated. call back and tell it to show itself.

// if the callback fails, this will remove it from the list, so don't

// assume that it's valid after this.

if (index == 0)

} finally

}}

解決方法很巧妙,實測可以用,學習了;

zblog二次回覆不顯示在側欄最新評論裡的修改方法

需要說明的是,這程式設計客棧幾條評論並不是被遮蔽了,而是正常出現在評論列表中。還需要說明的是,我每天進行評論回覆的時候,一般只從部落格首頁側欄的 最新評論 裡點選進去,沒有在後台檢視的習慣。博賺戀吧的回覆就是二次回覆,但是這個回覆內容是不會出現在部落格的 最新評論 列表裡的。不管部落格設計者出於何種...

mydate97時間控制項在IE中不顯示問題

1 這兩天做的乙個時間查詢,日期用mydate97控制項去選擇,但是在firfox下能夠正常顯示,並且能夠選擇日期,如下 但是在ie中卻怎麼都不顯示,也沒有指令碼錯誤。之後從demo中一步步那個刪啊,刪到最後,發現是引入js包的問題。引入wdatepicker.js的時候直接寫但是今天在ie中就是不...

Qt 在全屏時彈窗 選單和提示框不顯示的問題

這個是qt5的bug,參考鏈結 簡單翻譯就是,基於opengl的全屏視窗無法與上層視窗正確合成,給這個全屏視窗下移乙個畫素就行了。這裡有個討論串 其中有個方案就是直接移動視窗的。文章中說呼叫這句就行 qwindowswindowfunctions sethasborderinfullscreen t...