Broadcast Receiver

广播广泛运用于应用程序之间传输信息(进程间通信)的机制,而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>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容