廣播分兩類:
▲標準廣播:完全異步執(zhí)行的廣播G匦А!涎嚼!幾乎所有的廣播接收器都會同時接收到這條廣播消息阱州,沒有先后順序可言。
優(yōu)點:效率高法梯;
缺點:無法被截斷苔货。
▲有序廣播:同步執(zhí)行的廣播!A⒀啤蒲赂!廣播發(fā)出后,同一時刻只會有一個廣播接收器能夠收到這條廣播消息刁憋,當這個廣播接收器邏輯處理完了,才會繼續(xù)傳遞廣播木蹬。所以他是分先后順序的至耻,優(yōu)先級高的接收器會先收到廣播。
優(yōu)點:可截斷镊叁,后面的廣播接收器就收不到廣播了尘颓;
缺點:效率低,一個一個處理晦譬。
例如:
開機后:系統(tǒng)會在執(zhí)行finishBooting
函數(shù)時發(fā)送一條廣播疤苹,值為android.intent.action.BOOT_COMPLETED
的廣播。
自己發(fā)送和接收廣播:
標準廣播:
▲發(fā)送標準廣播:其實很簡單敛腌,只需要初始化一個Intent
,然后sendBroadcast
就行了
Intent intent = new Intent("com.czb.broadcast_test.MY_BROADCAST");
sendBroadcast(Intent);
▲想要接收自己發(fā)的廣播也很簡單:
新建一個BroadcastReceiver卧土,
繼承BroadcastReceiver
并重寫onReceive(Context var1, Intent)
在Manifest里面加<intent-fliter>
表明想接收的廣播的值
<receiver
android:name=".MyReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.czb.broadcast_test.MY_BROADCAST" />
</intent-filter>
</receiver>
然后intent.getAction();
就可以接收到廣播的值了惫皱,intent.getExtra("msg");
接收Intent里面存的數(shù)據(jù)。
有序廣播:
▲發(fā)送有序廣播:也很簡單尤莺,改一行代碼就可以:
Intent intent = new Intent("com.czb.broadcast_test.MY_BROADCAST");
sendOrderedBroadcast(Intent旅敷,null);
▲接收有序廣播:其實和接收標準廣播的區(qū)別不大:
1.可以識別BroadcastReceiver
的優(yōu)先級;
2.可以截斷廣播颤霎。
先在Manifest
里面加一句來設(shè)置優(yōu)先級
這里我設(shè)置的是最高優(yōu)先級100
<intent-filter android:priority=100>
<action android:name="com.czb.broadcast_test.MY_BROADCAST" />
</intent-filter>
然后在標準廣播的接收器改一下就可以接收并截斷廣播了;
在onReceive
里面加一句abortBroadcast();
就可以截斷廣播了
本地廣播:
只能在應(yīng)用程序內(nèi)部發(fā)送和接收廣播
這個就稍復(fù)雜一點了媳谁,需要借助LocalBroadcastManager
LocalBroadcastManager lbm = new LoadBroadcastManager.getInstance(this);
Intent intent = new Intent("com.czb.broadcast_test.MY_BROADCAST")
lbm.sendBroadcast(intent);
接收本地廣播:
LocalBroadcastManager lbm = new LoadBroadcastManager.getInstance(this);
...
LocalReceiver lr = new LocalReceive();
Intentfilter intentfliter = new Intentfliter("com.czb.broadcast_test.MY_BROADCAST");
lbm.registerReceiver(lr, intentfliter);//注冊本地廣播監(jiān)聽器
class LocalReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "received local broadcast", Toast.LENGTH_SHORT).show();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
// unregisterReceiver(networkChangeReceiver);
localBroadcastManager.unregisterReceiver(localReceiver);
}
這里寫了一個內(nèi)部類作為本地廣播接收器,而且我們這次沒有在Manifest
里面寫receiver
,而是動態(tài)注冊的廣播接收器;
這種方法也適用于注冊標準廣播接收器和有序廣播接收器,方法類似,不再贅述。
▲本地廣播接收器的優(yōu)勢:
1.明確知道正在發(fā)送的廣播不會離開我們的程序友酱,因此不必擔心信息泄露晴音;
2.其他程序也沒辦法給我們的程序發(fā)送廣播,沒有安全隱患缔杉;
3.本地廣播比一開始說的兩種廣播(系統(tǒng)全局廣播)更加高效锤躁。