android 8.0及以上版本對靜態註冊廣播嚴格限制

本文描述的是跨進程廣播的傳輸,在android8.0及以上版本的系統中,系統對註冊靜態廣播做了嚴格的限制,不能像低版本像發送動態廣播那樣直接發送廣播(就算髮送了,廣播接收方也接收不到),查看官網說明如下:https://developer.android.google.cn/about/versions/oreo/background 這裏是對廣播限制的部分說明,下面這個是對8.0系統的變更說面:https://developer.android.google.cn/about/versions/oreo/android-8.0-changes,想要詳細瞭解的可以查看下,本文主要說明下廣播方面的問題。

關於8.0的廣播發送,主要有兩種方式:1、動態註冊;2、靜態註冊;動態註冊方式的使用沒有任何改變,變化的主要是靜態註冊廣播的使用,在8.0中系統豁免了一部分靜態廣播的使用,換句話說就是我們可以直接以註冊靜態廣播的形式使用,豁免的廣播如下:https://developer.android.google.cn/guide/components/broadcast-exceptions,看到文章中的豁免內容我們發現,這只是系統廣播裏的一部分,當我們使用其他的某些系統廣播或者自定義廣播以註冊靜態廣播的形式調用時根本無法發送。

就目前而言有三種方式可以實現以註冊靜態廣播的形式進行使用:

1、

Intent intent = new Intent("action");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
     intent.setPackage("packagename");
}
intent.putExtra("info", info);
sendBroadcast(intent);

2、

Intent intent = new Intent("action");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
    //該方式適用:給其他應用的廣播接收者發送消息(指定應用的包名、指定類的全類名)
    intent.setComponent(new ComponentName("packagename", "packagename.receiver.TestReceiver"));
    intent.setClassName("packagename", "packagename.receiver.TestReceiver");
}
intent.putExtra("info", info);
sendBroadcast(intent);

3、

Intent intent = new Intent("action");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
    intent.addFlags(0x01000000);
}
intent.putExtra("info", info);
sendBroadcast(intent);

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章