Broadcast Receiver

2017-10-14  本文已影响0人  叙忆

广播广泛运用于应用程序之间传输信息(进程间通信)的机制,而BroadcastReceiver是对发送出来的广播进行过滤接收并响应

例子

image.png
系统的广播都是以Intent.ACTION_XXX的形式
静态注册
  1. 自定义BroadcastReceiver
public class BatteryLowReceiver extends BroadcastReceiver {
    private String TAG = "BatteryLowReceiver";

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d(TAG, "action = " + intent.getAction());
    }
}
  1. 在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();
            }
        }
    };

解决:

  1. 应该通过发送Intent给Service,Service来完成
  2. 不能使用子线程来解决,因为receiver生命周期很短,可能子线程未结束,receiver就先结束了,可能会有异常
自定义
  1. 自定义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);
    }
}
  1. 发送broadcast
Intent sendIntent = new Intent();
sendIntent.setAction(CustomReceiver.CUSTOME_ACTION);
sendBroadcast(sendIntent);
  1. 注册receiver
 <receiver android:name=".CustomReceiver">
            <intent-filter>
                <action android:name="com.zhang.custome_action"/>
            </intent-filter>
</receiver>
上一篇 下一篇

猜你喜欢

热点阅读