標籤:
1.BroadcastReceiver簡介:
BroadcastReceiver 廣播接收器,這個組件本質上就是一種全域監聽器,用於監聽全域廣播(Broadcast)訊息,因此它可以非常方便的實現系統不同組件之間的通訊。
BroadcastReceiver這個監聽器與普通的onXxxListener監聽器是不同的,onXxxListener是屬於應用程式層級的監聽器,當程式退出的時候那麼這個監聽器也就隨之結束了。而BroadcastReceiver(設定檔中註冊)屬於系統層級的監聽器,它擁有自己的進程,只要存在與之匹配的Broadcast以intent形式傳遞過來,那麼BroadcastReceiver就會被啟用。
與Activity不同的是,當系統通過Intent啟動指定的Activity組件時,如果系統沒有找到目標Activity組件,這時就會發生程式異常中斷,但系統通過Intent啟用BroadcastReceiver時,即使沒有找到目標BroadcastReceiver時,系統也不會有任何問題
2.建立BroadcastReceiver
2.1 首先需要繼承BroadcastReceiver類,重寫這個類裡面的onReceive()方法,代碼如下:
1 package com.example.administrator.broadcastreceivertest; 2 3 import android.content.BroadcastReceiver; 4 import android.content.Context; 5 import android.content.Intent; 6 import android.util.Log; 7 import android.widget.Toast; 8 9 10 public class MyBroadcastReceiver extends BroadcastReceiver{11 public MyBroadcastReceiver() {12 Log.i("tag","建立構造器...");13 }14 15 @Override16 public void onReceive(Context context, Intent intent) {17 String msg = intent.getStringExtra("msg");18 Toast.makeText(context,msg,Toast.LENGTH_SHORT).show();19 }20 }
當一個BroadcastReceiver被啟用之後,系統會為之建立一個BroadcastReceiver執行個體,並自動觸發它的onReceive()方法,onReceive()方法被執行完後,BroadcastReceiver執行個體就會被銷毀。如果BroadcastReceiver的onReceive()方法不能在10s內執行完成,Android會認為該程式無響應,所以不要在onReceive()方法中執行耗時操作,否則會彈出ANR(Application No Response)對話方塊。
如果在onReceive()方法中需要執行耗時操作,可以考慮使用Intent啟動一個Service來完成操作,此時不應該考慮啟動一個新的線程去處理耗時操作,因為BroadcastReceiver的生命週期很短,可能子線程還沒有結束,BroadcastReceiver就已經退出了。而如果BroadcastReceiver所在的進程結束了,那麼該線程就會標記為一個空線程。根據Android記憶體管理原則,在系統記憶體緊張時,會根據優先順序首先結束優先順序低的線程,而空線程優先順序無疑是擁有最低的優先順序,系統回收後,線程就無法完成相關操作了
2.2 註冊BroadcastReceiver
註冊BroadcastReceiver的兩種方式:
1>使用代碼進行指定(動態註冊),調用Context類提供的registerReceiver(BroadcastReceiver receiver,IntentFilter filter);代碼如下
1 MyBroadcastReceiver myBroadcastReceiver = new MyBroadcastReceiver();2 IntentFilter filter = new IntentFilter(SHOW_MESSAGE);3 registerReceiver(myBroadcastReceiver,filter);
IntentFilter 是根據SHOW_MESSAGE用來匹配Broadcast的,SHOW_MESSAGE是一個自訂的靜態字串常量。
要注意的是,BroadcastReceiver註冊的地方,google 官方指出:
Note: If registering a receiver in your Activity.onResume() implementation, you should unregister it in Activity.onPause(). (You won‘t receive intents when paused, and this will cut down on unnecessary system overhead). Do not unregister in Activity.onSaveInstanceState(), because this won‘t be called if the user moves back in the history stack.
意思大概是:如果你要在Activity類中的onResume()方法中註冊一個receiver,你也應該在Activity類onPause()方法中取消註冊。不要在onSaveInstanceState()方法中取消註冊,因為如果使用者退出當前Activity(從task中移除Activity)時,那麼這個BroadcastReceiver也將不能被啟用。
特點:當應用程式關閉後,就不再監聽。對於我們開發的App來說,越省電就會越受使用者的歡迎,所以對於那些沒有必要在應用程式退出後仍然進行監聽的receiver,在代碼中註冊是一個不錯的選擇
2>在AndroidManifest.xml中註冊(靜態註冊),代碼如下:
1 <receiver android:name=".MyBroadcastReceiver">2 <intent-filter>3 <action android:name="com.example.administrator.broadcastreceiver.SEND_MESSAGE"/>4 </intent-filter>5 </receiver>
特點:不管應用程式是否處於活動狀態,都會進行監聽。比如某個應用程式監聽記憶體使用量情況,當在手機上安裝好之後,不管其處於什麼狀態都會監聽記憶體狀態。
3.Broadcast介紹
3.1Broadcast被分為兩種:
1>Normal Broadcast(普通廣播):
Normal Broadcast是完全非同步,可以在同一時刻,被所有接收者接收到(邏輯上),訊息傳遞效率比較高。缺點是接收者不能將結果傳給下一個接收者,並且無法阻止Broadcast Intent的傳播
2>Ordered Broadcast(有序廣播):
Ordered Broadcast的接收者將按照預先聲明的優先順序次序依次接收Broadcast。如果priority:A>B>C,那麼Broadcast先傳給A->B->C。
3.2 發送廣播的兩種方式:
1>sendBroadcast():發送Normal Broadcast
2>sendOrderedBroadcast():發送Ordered Broadcast
對於Ordered Broadcast而言系統會根據接收者聲明的優先順序別按順序依次執行接收者,優先收到Broadcast的接收者可以終止Broadcast(調用BroadcastReceiver的abortBroadcast()方法),那麼後面的接收者將無法取到Broadcast.
不僅如此,對於Ordered Broadcast而言,優先順序別高的接收者,可以通過setResultExtras(Bundle bundle)將結果存到Broadcast中,下一個接收者可以通過Bundle bundle = getResultExtras(true)擷取上一個資料
TIP:系統接收簡訊,發出的Broadcast屬於Ordered Broadcast.如果想攔截使用者收到簡訊,可以設定優先權,讓自訂的BroadcastReceiver先接收到簡訊,然後終止broadcast。
Android四大組件之BroadcastReceiver