第一行程式碼學習筆記:關於BroadcastReceiver的實現方式
阿新 • • 發佈:2018-12-16
最近在學習郭霖大神的第一行程式碼第二版,在進行自定義廣播部分的例項練習時發現點選按鈕後未能接收到廣播訊息,經過程式碼排查和度娘查詢才知道原來是8.0版本開始已經不支援大部分的靜態註冊廣播了,然後結合網友們提供的方法並進行測試總結下:
方法1 動態註冊
既然靜態註冊可能會導致實效,那麼就只好在自己的程式內進行動態註冊吧,這樣總不會接收不到了:
private BroadcastReceiver myBroadcastReceiver; if(null == myBroadcastReceiver){ myBroadcastReceiver = new AnotherBroadcastReceiver(); IntentFilter filter = new IntentFilter(); filter.addAction("com.example.broadcasttest.MY_BROADCAST"); registerReceiver(myBroadcastReceiver, filter); }
方法2 傳送廣播時設定intent.setComponent
這個方法倒是能在靜態註冊下收到廣播呢,但是隻限定於在ComponentName裡設定的應用。。。呃,想多個應用都接收的話,多建幾個Intent吧,呵呵。。。
Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST"); // 相容安卓8.0 引數為(應用包名,廣播路徑),但是隻侷限於特定的應用能收到廣播 intent.setComponent(new ComponentName(getApplication().getPackageName(), "com.example.broadcasttest.MyBroadcastReceiver")); sendBroadcast(intent); //想要另一個應用也接收,再建一個 Intent intent1 = new Intent("com.example.broadcasttest.MY_BROADCAST"); intent1.setComponent(new ComponentName("com.example.broadcasttest2", "com.example.broadcasttest2.AnotherBroadcastReceiver")); sendBroadcast(intent1);
方法3 傳送廣播時設定intent.addFlags
然後有網友提供了這個方法,雖然現在還不明白原理,親測所有靜態註冊下的應用都能接收到廣播
Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST"); intent.setComponent(new ComponentName(getApplication().getPackageName(), "com.example.broadcasttest.MyBroadcastReceiver")); //突破限制,實現所有應用都可以收到廣播 intent.addFlags(0x01000000); sendBroadcast(intent);