**Android四大組件之BroadcastReceiver**
Broadcast Receiver
廣播接收器,是一種負責接收廣播消息并對消息做出響應的組件,和Service一樣并不提供與用戶交互的UI界面。它和事件處理機制類似,只不過事件處理機制是程序組件級別,而廣播事件是系統級別。
系統源碼:frameworks/base/core/java/android.content.BroadcastReceiver.java
**1)BroadcastReceiver生命周期**
BroadcastReceiver對象僅在調用onReceive()方法時有效,當該方法調用完畢,系統將摧毀這個對象。當下次再次受到廣播的時候將再次new生成一個BroadcastReceiver對象。當onReceive()方法在大概10秒內沒有執行完畢,系統會認為該程序無響應,所以在onReceive()方法如果需要做一些耗時的工作,我們可以通過發送Intet給其他Activity或Service來完成。
**2)Android標準的廣播ACTION**
~~~
ACTION_TIME_TICK
ACTION_TIME_CHANGED 時間改變
ACTION_TIMEZONE_CHANGED
ACTION_BOOT_COMPLETED 系統啟動完畢
ACTION_PACKAGE_ADDED 添加apk包
ACTION_PACKAGE_CHANGED apk包改變
ACTION_PACKAGE_REMOVED
ACTION_PACKAGE_RESTARTED
ACTION_PACKAGE_DATA_CLEARED
ACTION_UID_REMOVED
ACTION_BATTERY_CHANGED 電源改變
ACTION_POWER_CONNECTED 連接電源
ACTION_POWER_DISCONNECTED
ACTION_SHUTDOWN 關機
ACTION_CAMERA_BUTTON 拍照
ACTION_MEDIA_MOUNTED
~~~
**3)發布廣播**
我們可以在應用程序中創建自定義的廣播事件。廣播的內容和用于過濾廣播的Action都通過Intent對象發送出去。
~~~
{
protected static final String MY_ACTION="com.example.myBroadcast.ACTION"
Intent intent = new Intent();
intent.setAction(MY_ACTION);
intent.putExtra("msg", "This is my a broadcast message");
sendBroadCast(intent);
}
~~~
在上述代碼中我們通過setAction()方法向Intent對象中加入了過濾廣播的動作,這個動作是我們自定義的,像Android中內置的廣播動作一樣,這個動作可以用來唯一的識別我們自定義的廣播。
在Context中系統提供了三種發送廣播的方法:
**(1) Context.sendBroadcast();**
所有滿足條件的BroadcastReceiver都會執行其onReceive()方法
**(2) Context.sendStickyBroadcast();**
發送出去的Intent一直存在,而且如果以后系統中注冊的BroadcastReceiver滿足這個Action時會立即接收到這個廣播。
**(3) Context.sendOrderedBroadcast();**
發送出去的廣播會根據BroadcastReceiver注冊時IntentFilter設置的優先級的屬性來執行其onReceive()方法,相同優先級的BroadcastReceiver執行onReceive()方法的順序不確定。
**4)Broadcast Receiver的注冊**
如果我們希望在應用程序中能接受到某個廣播(Android系統內置的廣播或我們自己定義的廣播),并且對收到的廣播進行處理,那么我們需要創建一個BroadcastReceiver類,在其onReceive()方法中對廣播進行處理。同時我們還需要對我們的BroadcastReceiver進行注冊(告訴系統自己的存在)。
注冊BroadcastReceiver的方法有兩種:
**(1)在AndroidManifest.xml文件中注冊**
在AndroidManifest.xml中注冊的廣播屬于常駐型廣播,即使應用程序關閉了,還能接收到廣播。
首先我們需要創建一個類,繼承自BroadcastReceiver并實現其onReceive()方法
~~~
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String msg = intent.getStringExtra("msg");
Toast.makeText(context, "接收到的廣播為:"+msg, Toast.LENGTH_LONG).show();
}
}
~~~
然后在AndroidManifest.xml中注冊:
~~~
<receiver android:name=".MyBroadcastReceiver">
<intent-filter>
<action android:name="com.example.myBroadcast.ACTION"/>
</intent-filter>
</receiver>
~~~
**(2)在應用程序的代碼中注冊**
在代碼中使用registerReceiver()方法動態注冊的廣播屬于非常駐型廣播,當應用程序關閉后,我們調用了unregisterReceiver()解除了BroadcastReceiver,這種方法比較靈活。
在Activity中我們可以在onResume()方法中通過調用registerReceiver()方法注冊我們的BroadcastReceiver
然后在onStop()方法中調用unregisterReceiver()方法進行解注冊。
~~~
MyBroadcastReceiver myReceiver = null;
protected void onResume() {
super.onResume();
if(myReceiver == null ) {
myReceiver = new MyBroadcastReceiver();
IntentFilter filter = new InterFilter();
filter.addAction(MY_ACTION);
registerReceiver(myReceiver, filter);
}
}
protected void onStop() {
if( myReceiver != null ) {
unregisterReceiver(myReceiver);
myReceiver = null;
}
super.onStop();
}
~~~
- 前言
- Android開發之serviceManager分析
- Android啟動之init.c文件main函數分析
- Android開發之ProcessState和IPCThreadState類分析
- Android開發之MediaPlayerService服務詳解(一)
- Android系統五大布局詳解Layout
- Android四大組件之Content Provider
- Android四大組件之Service
- Android四大組件之BroadcastReceiver
- Android系統中的消息處理Looper、Handler、Message
- Android EditText/TextView使用SpannableString顯示復合文本
- Android關鍵資源詳解
- Android常用適配器分析(如何制作簡易Launcher)
- Android常用列表控件