Broadcast Receiver
2017-10-14 本文已影响0人
叙忆
广播广泛运用于应用程序之间传输信息(进程间通信)的机制,而BroadcastReceiver是对发送出来的广播进行过滤接收并响应
例子
- 电池的使用状态
- 电话的接收
- 短信的接收

系统的广播都是以Intent.ACTION_XXX的形式
静态注册
- 自定义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>
动态注册
1.实例BroadcastReceiver
private BroadcastReceiver mBatteryReceiver =new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Log.d(TAG, "action = " + intent.getAction());
}
};
2.动态注册,注销
@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()内做超过10s的操作,就会报错
当接收到广播时,进行耗时操作,例如线程休眠,出现ANR错误(Application not response),如下
private BroadcastReceiver mBatteryReceiver =new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
//耗时操作,当点击屏幕UI,无法操作 ANR错误
try{
Thread.sleep(15000);
}catch (InterruptedException e){
e.printStackTrace();
}
}
};
解决:
- 应该通过发送Intent给Service,Service来完成
- 不能使用子线程来解决,因为receiver生命周期很短,可能子线程未结束,receiver就先结束了,可能会有异常
自定义
- 自定义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);
}
}
- 发送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>