這里是引用钦睡,本文主要是《第一行代碼》閱讀筆記!由于剛開始學習Android膀估,所以肯定有很多見解不成熟幔亥。希望看到的人能多多指正,有問題的地方可以提在評論察纯,多謝賜教帕棉!
? ? ? ?BroadcastReceiver,廣播接收者饼记。Android四大組件之一香伴,它的本質(zhì)就是一個全局的監(jiān)聽器【咴颍可以監(jiān)聽到各種廣播即纲,包括系統(tǒng)廣播、應用廣播博肋〉驼可以用來實現(xiàn)不同組件之間的通信蜂厅。
? ? ? ?在Android中,廣播可以分為兩大類:標準廣播(Normal broadcasts)和有序廣播(Ordered broadcasts)膊畴。
標準廣播:一種異步執(zhí)行的廣播掘猿,在廣播發(fā)出后所有的接收者幾乎是同一時間接收到廣播。這種廣播效率很高唇跨,但是沒有先后順序所以一位置不能被截斷稠通。
有序廣播:一種同步執(zhí)行的廣播,在廣播發(fā)出后優(yōu)先級最高的廣播接收器可以接收到這條廣播轻绞,當這個廣播接收器中的邏輯執(zhí)行完成以后采记,廣播才會繼續(xù)傳遞。因此如果在優(yōu)先級高的廣播接收器中截斷了正在傳遞的廣播政勃,那么后面的廣播接收器就無法接收到這條廣播唧龄。
發(fā)送廣播的基本步驟:
1.創(chuàng)建需要啟動BroadCastReceiver的Intent
2.調(diào)用Context的sendBroadcast()方法或者sendOrderedBroadcast()方法發(fā)送廣播。其中sendBroadcast()發(fā)送的是標準廣播奸远,sendOrderedBroadcast()發(fā)送的是有序廣播既棺。
標準廣播
Intent intent = new Intent("com.zwf.broadcastdemo.MY_BROADCAST");
sendBroadcast(intent);
有序廣播
Intent intent = new Intent("com.zwf.broadcastdemo.MY_ODERED_BROADCAST");
sendOrderedBroadcast(intent, null);
接收廣播的基本步驟:
我們可以接收自定義的廣播,也可以接收系統(tǒng)的廣播懒叛。系統(tǒng)會發(fā)出很多廣播丸冕,例如開機啟動完成,電量過低等都會發(fā)出廣播薛窥,但是想接收這些廣播需要聲明權(quán)限胖烛。
1.創(chuàng)建一個類繼承自BroadCastReceiver,重寫父類的onReceive()方法诅迷。這樣當消息來了佩番,就會執(zhí)行onReceive()方法中的邏輯。
2.注冊BroadcastReceiver罢杉,實現(xiàn)了BroadcastReceiver需要注冊一下趟畏,有兩種方式:
- 動態(tài)注冊:這種方法是通過java代碼注冊。這種注冊方式注冊的廣播接收者為非駐型廣播滩租,它會隨著Activity的生命周期變化赋秀,所以在Activity推出的時候我們需要調(diào)用unregisterReceiver(netWorkBroadCastReceiver)方法取消注冊。下面是注冊代碼:
intentFilter = new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE");
netWorkBroadCastReceiver = new NetWorkBroadCastReceiver();
registerReceiver(netWorkBroadCastReceiver, intentFilter);
- 靜態(tài)注冊:這種方法是通過AndroidManifest.xml文件注冊律想。通過這種方式注冊的廣播為常駐型廣播猎莲,也就是說如果應用程序關(guān)閉了,有相應事件觸發(fā)蜘欲,程序還是會被系統(tǒng)自動調(diào)用運行益眉。這樣可以做到程序還沒運行,就可以實現(xiàn)某個廣播的接收注冊姥份,比如開機啟動廣播郭脂。
<!-- 靜態(tài)注冊廣播接收者(此時的接收者不能是內(nèi)部類) -->
<receiver android:name=".BootCompleteReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"></action>
</intent-filter>
</receiver>
BroadCastReceiver的生命周期
這一塊內(nèi)容主要是參考的這位同學的博客,其實對于何時使用service還不是很了解澈歉≌辜Γ可能下一部分內(nèi)容是看服務!
? ? ? ?BroadcastReceiver的生命周期埃难,從對象調(diào)用它開始莹弊,到onReceiver方法執(zhí)行完成之后結(jié)束。另外涡尘,每次廣播被接收后會重新創(chuàng)建BroadcastReceiver對象忍弛,并在onReceiver方法中執(zhí)行完就銷毀,如果BroadcastReceiver的onReceiver方法中不能在10秒內(nèi)執(zhí)行完成考抄,Android會出現(xiàn)ANR異常细疚。所以不要在BroadcastReceiver的onReceiver方法中執(zhí)行耗時的操作。
如果需要在BroadcastReceiver中執(zhí)行耗時的操作川梅,可以通過Intent啟動Service來完成疯兼。但不能綁定Service。
特別是贫途,您可能無法從一個BroadcastReceiver中顯示一個對話框吧彪,或綁定到服務。對于前者丢早,則應該使用NotificationManager的API姨裸。對于后者,你可以使用Context.startService()來啟動一個Service怨酝。
本地廣播
? ? ? ?前面所發(fā)送和接收的所用廣播都屬于系統(tǒng)的全局廣播傀缩,我們發(fā)出的這些廣播可以給系統(tǒng)中任何應用程序接收到,當然我們也可以接受其他應用程序的廣播凫碌。但是扑毡,只用本地廣播機制發(fā)出的廣播只能在本應用程序中接收到。這樣的話安全性得到了提升盛险。本地廣播機制主要是用LocalBroadcastManager來管理瞄摊,它提供了發(fā)送廣播的方法sendBroadcast()和sendBroadcastSync()(這也方法好像用的不多,我暫時沒有深究苦掘,等以后真正用到可以查一下)换帜,注冊接收者的方法registerReceiver(localReceiver, localIntentTilter),需要兩個參數(shù),取消注冊的方法localBroadcastManager.unregisterReceiver(localReceiver);
下面看一下本地廣播機制的工作流程:
1.發(fā)送本地廣播
//發(fā)送本地廣播
localBroadcastManager = LocalBroadcastManager.getInstance(this); //獲取本地廣播管理實例
localCastBtn = (Button) findViewById(R.id.local_btn);
localCastBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//發(fā)送本地廣播
Intent intent = new Intent("com.zwf.broadcastdemo.LOCAL_BROADCAST");
localBroadcastManager.sendBroadcast(intent);
}
});
2.注冊廣播接收者
//注冊本地廣播監(jiān)聽
localIntentTilter = new IntentFilter("com.zwf.broadcastdemo.LOCAL_BROADCAST");
localReceiver = new LocalReceiver();
localBroadcastManager.registerReceiver(localReceiver, localIntentTilter);
3.取消注冊
//取消本地廣播監(jiān)聽
localBroadcastManager.unregisterReceiver(localReceiver);
關(guān)于BroadCastReceiver就總結(jié)這么多鹤啡,等以后實際項目用到的話知道有這么一個用法惯驼,其他再去查。有新記錄會及時補充。