美文网首页
Broadcast Receiver

Broadcast Receiver

作者: 叙忆 | 来源:发表于2017-10-14 11:43 被阅读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>
    

    相关文章

      网友评论

          本文标题:Broadcast Receiver

          本文链接:https://www.haomeiwen.com/subject/ierxuxtx.html