美文网首页
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>

相关文章

  • Android BroadcastReceiver详解

    Broadcast Receiver是什么 Broadcast Receiver是四大组件之一,是一种广泛运用在应...

  • Activity之生命周期

    Android四大组件有Activity,Service,Broadcast Receiver,Broadcast...

  • Broadcast Receiver

    一、广播 1.广播定义 Broadcast Receiver是一种广泛运用的在程序之间传输信息的机制,androi...

  • Broadcast Receiver

    广播的定义 四大组件之一,是安卓应用程序之间传递信息的机制。我们要发送的广播内容是一个Intent,这个Inten...

  • Broadcast Receiver

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

  • Broadcast Receiver

    一.广播 1.在Android中,Broadcast在应用程序之间传输信息的机制,我们发送的广播内容是一个Inte...

  • Broadcast Receiver

    广播的两种类型 标准广播(Normal broadcasts) : 是一种完全异步执行的广播,在广播发出后,所有...

  • Broadcast Receiver

    1.请描述一下 BroadcastReceiver(★★) BroadCastReceiver 是 Android...

  • Broadcast Receiver

    1.系统广播 答:就是手机中自带的广播,例如 手机快没电了、拍照、屏幕的开关等等手机系统发出的广播,根据特定的指令...

  • android-服务Service

    #组件 * Activity * broadcast Receiver * Service : 服务 > wind...

网友评论

      本文标题:Broadcast Receiver

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