broadcast receiver–廣播接收器,接受全局的廣播。
根據廣播的種類分爲系統廣播和自定義廣播。
- 系統廣播:電池消耗情況,開關機。一般系統廣播爲有序廣播
- 自定義廣播:自己定義一個廣播。
根據廣播的傳播方式分爲:普通廣播和有序廣播(orderedBroadcast) - 普通廣播:異步執行,當一個broadcast發出後,所有與之匹配的broadcast都會同時接收到廣播。
- 有序廣播:同步執行,會根據之前設置的優先級有序的執行,優先級高的接收器可以截斷廣播,從而停止廣播的傳送,傳說中的短信電話攔截就是用的這個原理。
根據廣播的註冊方式分爲靜態註冊和動態註冊。 - 靜態註冊:在AndroidManifest中進行註冊,廣播會一直存在除非退出app。一般多用於系統廣播註冊。
動態註冊:在類中通過context.registerBroadcast()進行註冊,可以通過onResume()註冊,onPause()註銷。
廣播的發送方式:sendBroadcast(intent);
- sendOrderedBroadcast(intent);–發送有序廣播
onReceiver方法–當接收器接收到傳遞的廣播時會調用onreiver方法,但是BroadcastReceiver的週期在onReceiver結束後結束,而且onReceiver是運行在主線程中的,如果需要執行耗時程序,需要開啓service,創建新線程。
以下就通過代碼來運用廣播的註冊與發送。
- 靜態註冊廣播
<receiver android:name=".broadcast.MyReceiver" >
<intent-filter>
<action android:name="android.action.test" />
</intent-filter>
<intent-filter>
<action android:name="android.action.dynamic.test"/>
</intent-filter>
</receiver>
@OnClick(R.id.send_broadcast)
void sendBroad() {
Intent intent = new Intent().setAction("android.action.test");
intent.putExtra("broad","register broadcast");
sendBroadcast(intent);
}
- 動態註冊廣播
@Override
protected void onResume() {
Log.i(TAG, "onResume");
super.onResume();
IntentFilter intentFilter=new IntentFilter();
intentFilter.addAction("android.action.dynamic.test");
registerReceiver(new MyReceiver(), intentFilter);
}
@Override
protected void onPause() {
Log.i(TAG, "onPause");
super.onPause();
unregisterReceiver(new MyReceiver());
}
@OnClick(R.id.send_dynemic_broadcast)
void sendDynemicBroad(){
Intent intent =new Intent().setAction("android.action.dynamic.test");
intent.putExtra("broad","dynamic reggister broadcast");
sendBroadcast(intent);
}
繼承BroadcaReceiver的類,調用onReceiver方法。
public class MyReceiver extends BroadcastReceiver {
public MyReceiver() {
}
// 不能執行超過5秒的任務,可以用service,關於context,若是靜態註冊,則context爲系統context,若動態註冊,則context爲註冊的那個類
@Override
public void onReceive(Context context, Intent intent) {
// TODO: This method is called when the BroadcastReceiver is receiving
// an Intent broadcast.
if (**intent.getAction().equals("android.action.dynamic.test")**){
DebugLog.i("broad"+intent.getStringExtra("broad"));
Toast.makeText(context,intent.getStringExtra("broad"),Toast.LENGTH_SHORT).show();
}else if (intent.getAction().equals("android.action.test")){
DebugLog.i("dynamicBroad"+intent.getStringExtra("broad"));
Toast.makeText(context,intent.getStringExtra("broad"),Toast.LENGTH_SHORT).show();
}
Log.i("MyReceive", "onReceive" + intent.getAction());
}
}
上圖圖片就是靜態註冊和動態註冊後執行的方法