Android之BroadcastReceiver,broadcastreceiver
簡介:
BroadcastReceiver本質上就是一種全域的監聽器,用於監聽系統全域的廣播訊息,因此它可以非常方便地實現系統中不同組件之間的通訊。
特點:
1.BroadcastReceiver用於接收程式所發出的Broadcast Intent,與應用程式啟動Activity、Service相同;
2.當應用程式發出一個Broadcast Intent之後,所有匹配該Intent的BroadcastReceiver都有可能被啟動;
用法:
網上流行的一張圖片可以很好的感受到broadcastreceiver的主要用法:
本次我們通過一個小的樣本來一起學習BroadcastReceiver:
建立三個廣播類,前兩個在manifest裡面註冊,稱為靜態註冊,最後一個沒有在manifest裡面註冊而在代碼中註冊,稱為動態註冊,發送廣播的時候有顯示發送和隱式發送兩種區別。
首先我們來看一下三個廣播接收器類的定義以及manifest裡面的片段內容如下:
import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.widget.Toast;public class MyReceiver01 extends BroadcastReceiver{@Overridepublic void onReceive(Context context, Intent intent) {String msg = intent.getExtras().getString("data");Toast.makeText(context, "MyReceiver01收到訊息:" + msg, Toast.LENGTH_SHORT).show();}}
import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.widget.Toast;public class MyReceiver02 extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {String msg = intent.getExtras().getString("data");Toast.makeText(context, "MyReceiver02收到訊息:" + msg, Toast.LENGTH_SHORT).show();}}
public class MyReceiver03 extends BroadcastReceiver {public final static String INTENT_ACTION_MYRECEIVER03 = "com.bear.broadcastreceiver.intent.action.receiver03";@Overridepublic void onReceive(Context context, Intent intent) {String msg = intent.getExtras().getString("data");Toast.makeText(context, "MyReceiver03收到訊息:" + msg, Toast.LENGTH_SHORT).show();//abortBroadcast(); 取消廣播,後續receiver將無法接收到訊息}}
<receiver android:name="com.bear.broadcastreceiver.MyReceiver01" ></receiver> <receiver android:name="com.bear.broadcastreceiver.MyReceiver02"> <intent-filter > <action android:name="com.bear.broadcastreceiver.intent.action.receiver02"/> </intent-filter> </receiver>
主介面共有5個按鈕用來測試,主介面類的定義如下:
import android.app.Activity;import android.content.Intent;import android.content.IntentFilter;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;public class MainActivity extends Activity implements OnClickListener{private IntentFilter intentFilter;private MyReceiver03 receiver;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);setupViews();intentFilter = new IntentFilter(MyReceiver03.INTENT_ACTION_MYRECEIVER03);receiver = new MyReceiver03();}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.button1://顯式發送廣播Intent intent = new Intent(MainActivity.this, MyReceiver01.class);intent.putExtra("data", "bear");sendBroadcast(intent);break;case R.id.button2://隱式發送廣播Intent intent02 = new Intent("com.bear.broadcastreceiver.intent.action.receiver02");intent02.putExtra("data", "bear02");sendBroadcast(intent02);break;case R.id.button3://動態註冊廣播registerReceiver(receiver, intentFilter);break;case R.id.button4:Intent intent03 = new Intent(MyReceiver03.INTENT_ACTION_MYRECEIVER03);intent03.putExtra("data", "bear03");sendBroadcast(intent03);//sendOrderedBroadcast(intent03, receiverPermission); 按優先順序發送廣播break;case R.id.button5://登出廣播unregisterReceiver(receiver);break;default:break;}}private void setupViews(){findViewById(R.id.button1).setOnClickListener(this);findViewById(R.id.button2).setOnClickListener(this);findViewById(R.id.button3).setOnClickListener(this);findViewById(R.id.button4).setOnClickListener(this);findViewById(R.id.button5).setOnClickListener(this);}}
總結:
1. 每次系統廣播(Broadcast)事件發生後,系統就會建立對應的BroadcastReceiver執行個體,並自動觸發它的onReceive()方法,onReceive()方法執行完後,BroadcastReceiver的執行個體就會被銷毀;
2.如果BroadcastReceiver的onReceive()方法不能在10秒內執行完成,Android會認為該程式無響應。所以不要在廣播接收者的onReceive()方法裡執行一些耗時的操作,否則會彈出ANR(Application No Response)的對話方塊;
3.如果確實需要根據廣播來完成一項比較耗時的操作,則可以考慮通過Intent啟動一個Service來完成該操作。不應考慮使用新線程去完成耗時的操作,因為BroadcastReceiver本身的生命週期極短,可能出現的情況是子線程可能還沒有結束,BroadcastReceiver就已經退出了;
最後在這裡附上整個demo工程源碼:
Android BroadcastReceiver