廣播廣泛運(yùn)用于應(yīng)用程序之間傳輸信息(進(jìn)程間通信)的機(jī)制,而BroadcastReceiver是對發(fā)送出來的廣播進(jìn)行過濾接收并響應(yīng)
例子
- 電池的使用狀態(tài)
- 電話的接收
- 短信的接收

image.png
系統(tǒng)的廣播都是以Intent.ACTION_XXX的形式
靜態(tài)注冊
- 自定義BroadcastReceiver
public class BatteryLowReceiver extends BroadcastReceiver {
private String TAG = "BatteryLowReceiver";
@Override
public void onReceive(Context context, Intent intent) {
Log.d(TAG, "action = " + intent.getAction());
}
}
- 在AndroidManifest中注冊
<receiver android:name=".BatteryLowReceiver">
<intent-filter>
<action android:name="android.intent.action.BATTERY_CHANGED"/>
<action android:name="android.intent.action.BATTERY_LOW"/>
<action android:name="android.intent.action.BATTERY_OKAY"/>
</intent-filter>
</receiver>
動態(tài)注冊
1.實例BroadcastReceiver
private BroadcastReceiver mBatteryReceiver =new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Log.d(TAG, "action = " + intent.getAction());
}
};
2.動態(tài)注冊,注銷
@Override
protected void onResume() {
super.onResume();
IntentFilter filter=new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
filter.addAction(Intent.ACTION_BATTERY_LOW);
filter.addAction(Intent.ACTION_BATTERY_OKAY);
registerReceiver(mBatteryReceiver,filter);
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(mBatteryReceiver);
}
生命周期
生命周期只有10s,如果在onReceiver()內(nèi)做超過10s的操作,就會報錯
當(dāng)接收到廣播時,進(jìn)行耗時操作,例如線程休眠,出現(xiàn)ANR錯誤(Application not response),如下
private BroadcastReceiver mBatteryReceiver =new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
//耗時操作,當(dāng)點擊屏幕UI,無法操作 ANR錯誤
try{
Thread.sleep(15000);
}catch (InterruptedException e){
e.printStackTrace();
}
}
};
解決:
- 應(yīng)該通過發(fā)送Intent給Service,Service來完成
- 不能使用子線程來解決,因為receiver生命周期很短,可能子線程未結(jié)束,receiver就先結(jié)束了,可能會有異常
自定義
- 自定義receiver
public class CustomReceiver extends BroadcastReceiver {
public static final String CUSTOME_ACTION = "com.zhang.custome_action";
@Override
public void onReceive(Context context, Intent intent) {
Log.i("###", intent.getAction());
//啟動另一個activity
Intent startIntent = new Intent(context, MainActivity.class);
startIntent.setAction(CUSTOME_ACTION);
startIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(startIntent);
}
}
- 發(fā)送broadcast
Intent sendIntent = new Intent();
sendIntent.setAction(CustomReceiver.CUSTOME_ACTION);
sendBroadcast(sendIntent);
- 注冊receiver
<receiver android:name=".CustomReceiver">
<intent-filter>
<action android:name="com.zhang.custome_action"/>
</intent-filter>
</receiver>