這里是引用,本文主要是《第一行代碼》閱讀筆記!由于剛開始學習Android,所以肯定有很多見解不成熟。希望看到的人能多多指正,有問題的地方可以提在評論,多謝賜教!
? ? ? ?BroadcastReceiver,廣播接收者。Android四大組件之一,它的本質就是一個全局的監聽器。可以監聽到各種廣播,包括系統廣播、應用廣播。可以用來實現不同組件之間的通信。
? ? ? ?在Android中,廣播可以分為兩大類:標準廣播(Normal broadcasts)和有序廣播(Ordered broadcasts)。
標準廣播:一種異步執行的廣播,在廣播發出后所有的接收者幾乎是同一時間接收到廣播。這種廣播效率很高,但是沒有先后順序所以一位置不能被截斷。
有序廣播:一種同步執行的廣播,在廣播發出后優先級最高的廣播接收器可以接收到這條廣播,當這個廣播接收器中的邏輯執行完成以后,廣播才會繼續傳遞。因此如果在優先級高的廣播接收器中截斷了正在傳遞的廣播,那么后面的廣播接收器就無法接收到這條廣播。
發送廣播的基本步驟:
1.創建需要啟動BroadCastReceiver的Intent
2.調用Context的sendBroadcast()方法或者sendOrderedBroadcast()方法發送廣播。其中sendBroadcast()發送的是標準廣播,sendOrderedBroadcast()發送的是有序廣播。
標準廣播
Intent intent = new Intent("com.zwf.broadcastdemo.MY_BROADCAST");
sendBroadcast(intent);
有序廣播
Intent intent = new Intent("com.zwf.broadcastdemo.MY_ODERED_BROADCAST");
sendOrderedBroadcast(intent, null);
接收廣播的基本步驟:
我們可以接收自定義的廣播,也可以接收系統的廣播。系統會發出很多廣播,例如開機啟動完成,電量過低等都會發出廣播,但是想接收這些廣播需要聲明權限。
1.創建一個類繼承自BroadCastReceiver,重寫父類的onReceive()方法。這樣當消息來了,就會執行onReceive()方法中的邏輯。
2.注冊BroadcastReceiver,實現了BroadcastReceiver需要注冊一下,有兩種方式:
- 動態注冊:這種方法是通過java代碼注冊。這種注冊方式注冊的廣播接收者為非駐型廣播,它會隨著Activity的生命周期變化,所以在Activity推出的時候我們需要調用unregisterReceiver(netWorkBroadCastReceiver)方法取消注冊。下面是注冊代碼:
intentFilter = new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE");
netWorkBroadCastReceiver = new NetWorkBroadCastReceiver();
registerReceiver(netWorkBroadCastReceiver, intentFilter);
- 靜態注冊:這種方法是通過AndroidManifest.xml文件注冊。通過這種方式注冊的廣播為常駐型廣播,也就是說如果應用程序關閉了,有相應事件觸發,程序還是會被系統自動調用運行。這樣可以做到程序還沒運行,就可以實現某個廣播的接收注冊,比如開機啟動廣播。
<!-- 靜態注冊廣播接收者(此時的接收者不能是內部類) -->
<receiver android:name=".BootCompleteReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"></action>
</intent-filter>
</receiver>
BroadCastReceiver的生命周期
這一塊內容主要是參考的這位同學的博客,其實對于何時使用service還不是很了解。可能下一部分內容是看服務!
? ? ? ?BroadcastReceiver的生命周期,從對象調用它開始,到onReceiver方法執行完成之后結束。另外,每次廣播被接收后會重新創建BroadcastReceiver對象,并在onReceiver方法中執行完就銷毀,如果BroadcastReceiver的onReceiver方法中不能在10秒內執行完成,Android會出現ANR異常。所以不要在BroadcastReceiver的onReceiver方法中執行耗時的操作。
如果需要在BroadcastReceiver中執行耗時的操作,可以通過Intent啟動Service來完成。但不能綁定Service。
特別是,您可能無法從一個BroadcastReceiver中顯示一個對話框,或綁定到服務。對于前者,則應該使用NotificationManager的API。對于后者,你可以使用Context.startService()來啟動一個Service。
本地廣播
? ? ? ?前面所發送和接收的所用廣播都屬于系統的全局廣播,我們發出的這些廣播可以給系統中任何應用程序接收到,當然我們也可以接受其他應用程序的廣播。但是,只用本地廣播機制發出的廣播只能在本應用程序中接收到。這樣的話安全性得到了提升。本地廣播機制主要是用LocalBroadcastManager來管理,它提供了發送廣播的方法sendBroadcast()和sendBroadcastSync()(這也方法好像用的不多,我暫時沒有深究,等以后真正用到可以查一下),注冊接收者的方法registerReceiver(localReceiver, localIntentTilter),需要兩個參數,取消注冊的方法localBroadcastManager.unregisterReceiver(localReceiver);
下面看一下本地廣播機制的工作流程:
1.發送本地廣播
//發送本地廣播
localBroadcastManager = LocalBroadcastManager.getInstance(this); //獲取本地廣播管理實例
localCastBtn = (Button) findViewById(R.id.local_btn);
localCastBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//發送本地廣播
Intent intent = new Intent("com.zwf.broadcastdemo.LOCAL_BROADCAST");
localBroadcastManager.sendBroadcast(intent);
}
});
2.注冊廣播接收者
//注冊本地廣播監聽
localIntentTilter = new IntentFilter("com.zwf.broadcastdemo.LOCAL_BROADCAST");
localReceiver = new LocalReceiver();
localBroadcastManager.registerReceiver(localReceiver, localIntentTilter);
3.取消注冊
//取消本地廣播監聽
localBroadcastManager.unregisterReceiver(localReceiver);
關于BroadCastReceiver就總結這么多,等以后實際項目用到的話知道有這么一個用法,其他再去查。有新記錄會及時補充。