繼承 BroadcastReceiver 類,重寫 onReceive 方法。java
public class MyBroadcastReceiver1 extends BroadcastReceiver {
private static final String TAG = "廣播接收者===";
@Override
public void onReceive(Context context, Intent intent) {
Log.i(TAG, "onReceive: 我是動態註冊的廣播111111111111 "+hashCode());
}
}
複製代碼
靜態註冊android
在 AndroidManifest.xml 裏面進行註冊網絡
<!--在設置action裏面的name的時候,雖然能夠隨便設置,可是儘可能用包名作 前綴,符合程序規則,這裏爲了測試就隨便寫了-->
<receiver android:name=".broadcastreceiver.MyBroadcastReceiver3">
<intent-filter android:priority="1010">
<action android:name="test" />
</intent-filter>
</receiver>
複製代碼
動態註冊ide
首先建立實例測試
MyBroadcastReceiver1 myBroadcastReceiver1 = new MyBroadcastReceiver1();
複製代碼
註冊廣播this
IntentFilter filter1 = new IntentFilter("test");
//設置優先級
filter1.setPriority(100);
registerReceiver(myBroadcastReceiver1, filter1);
複製代碼
反註冊廣播spa
unregisterReceiver(myBroadcastReceiver1);
複製代碼
注意: 1. 通常咱們在進行動態註冊後,必定要進行反註冊操做,避免資源浪費。反註冊操做通常在 Activity 的 onDestroy 中進行 2.必定要在進行註冊後才進行反註冊操做,不然程序會直接崩潰。線程
有序廣播code
Intent test = new Intent("test");
sendOrderedBroadcast(test,null);
//or 下面方法爲指定一個 最終廣播接收者 此綁定着不受 中斷廣播影響,最終都會接收到廣播。
/*有意思的是,若是最終廣播接受者的接收消息的優先級在執行中斷廣播操做的廣播接受者之上的時候, 會先接收到消息,而後中斷廣播後最終又會接收到一次消息,總共接收到兩次消息。 固然,若是不執行中斷廣播的操做,仍是會先按照廣播接收順序接收一次消息後,最終再接收一次,總共兩次*/
sendOrderedBroadcast(test, null, myBroadcastReceiver1, null, 0, null, null);
複製代碼
能夠經過abortBroadcast()進行中斷廣播,後面的廣播接受者都不能進行接收廣播。xml
能夠經過在 onReceive 改變傳遞數據。
@Override
public void onReceive(Context context, Intent intent) {
Bundle bundle = new Bundle();
//傳遞數據
bundle.putString("aaa","我是接受者1");
setResultExtras(bundle);
}
///////////////////////////////
@Override
public void onReceive(Context context, Intent intent) {
Bundle resultExtras = getResultExtras(true);
//要對resultExtras 進行判空處理,若是前面沒有傳遞數據,這裏的resultExtras會爲null
//改變前面廣播發送的數據
if(resultExtras!=null){
resultExtras.putString("aaa","我是接受者2");
}
}
//最終後面接收到的 "aaa" 的值爲 "我是接受者2"
///////////////////
@Override
public void onReceive(Context context, Intent intent) {
//中斷廣播
abortBroadcast();
}
複製代碼
sendOrderedBroadcast(test,null) 第二個參數是廣播接受者指定所需的權限。 (這個有待研究, 在設置指定權限後,好像其餘沒有指定權限的廣播接收者也能收到廣播,懵逼。。。看到網上的提示:Android對同一PID的權限驗證是直接經過的。所以若是Sender和Receiver在同一進程,是不能作權限限制的。 具體代碼能夠看一下ActivityManagerService的checkComponentPermission)
無序廣播
Intent intent2 = new Intent("test");
sendBroadcast(intent2);
複製代碼
本地廣播
使用 LocalBroadcastManager 進行發送本地廣播和註冊本地廣播,只能發送無序廣播。本地廣播只能進行動態註冊,其發送的廣播只能在本進程中接收,註冊的廣播只能被本進程發送的廣播接收。
//獲取本地廣播管理器單例
LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(context);
//註冊本地廣播
IntentFilter filter1 = new IntentFilter("test");
filter1.setPriority(100);
localBroadcastManager.registerReceiver(myBroadcastReceiver1, filter1);
//發送本地廣播
Intent test = new Intent("test");
localBroadcastManager.sendBroadcast(test);
複製代碼
使用本地廣播能夠防止外部應用惡意接收咱們的廣播數據,並進行篡改。也能夠防止外部應用惡意的發送垃圾廣播給咱們。
- 有序廣播:
1. 優先級(priority)高的優先於低的。
2. 同優先級不一樣註冊方式狀況下,動態高於靜態。
3. 同優先級同註冊方式狀況下,動態註冊:先註冊的高於後註冊的,靜態註冊:先掃描的優先於後掃描的。
- 無序廣播:
1. 動態註冊高於靜態註冊,無視優先級。
2. 不一樣優先級同註冊方式,根據優先級高低進行排序。
3. 同優先級同註冊方式狀況下,動態註冊:先註冊的高於後註冊的,靜態註冊:先掃描的優先於後掃描的。
複製代碼
在Android8.0以上,靜態註冊的廣播,是接收不到隱式發送的廣播的,只能接收經過顯示方式發送的廣播,也就是 intent.setComponent() 指定一個廣播。 動態註冊的廣播不受影響。
Intent intent2 = new Intent("test");
intent2.setComponent(new ComponentName(this, MyBroadcastReceiver4.class));
sendBroadcast(intent2);
複製代碼
《愛上Android》書籍