Android Broadcast

Broadcast

广播介绍&使用

  1. 广播是android中各个模块通信的一种方法。有发送方,接收方。

  2. 发广播的方式如下代码:

             Intent intent  = new Intent();
             intent.setAction("com.xxx.just_for_test");
             sendBroadcast(intent);
    

3.广播的接受有两种方式(1)静态注册(2)动态注册
       (1)动态注册

    IntentFilter filter = new IntentFilter();
    filter.addAction("com.xxx.just_for_test");
    this.registerReceiver(mReceiver, filter);

    private BroadcastReceiver mReceiver = new BroadcastReceiver() {
        @Override
         public void onReceive(Context context, Intent intent) {
         Log.d("TAG", "onReceive: ");
    }
};

       onReceive中就是对接受到这个广播的处理,注意动态注册的在最后要进行unRegisterReceiver()跟activity的生命周期保证一致。
       (2)静态注册
        首先要在manifest中注册:

  //表示可以接收到外部APK的信息
    
        
    
    

        注意action 要对应,然后新起一个类

public class TestReceiver  extends BroadcastReceiver {
    @Override
      public void onReceive(Context context, Intent intent) {
      Log.d("TAG","onReceive");
  }

}
       这样两个广播的方式就都写出来了,简单的用法就是这样。唯一需要注意的就是onReceive方法中是在主线程执行的,10S干不完事情就会报ANR
       例外用内部类实现也是可以的,但是要使用静态内部类,首席实例化xml的时候会去实例化你这个内部类,非静态内部类的实现要通过父类,因为父类没有实例化 所以会一直报错has no zero argument constructor。设置成静态内部类就没有这个问题。
       这里可以mark一下,java基础。

广播分类

  1. 普通广播
           普通广播就是我们调用的sendBroadcast(),只要注册了action的Receiver(不同的APP也可以)都可以接到,但是接到的这个的过程是异步的,谁先谁后不知道。

  2. 有序广播
           就是考虑一个优先级。取值范围-1000~1000越大优先级越高 静态:

           
             
           
    

动态:

        IntentFilter filter = new IntentFilter();
        filter.addAction("com.xxx.just_for_test");
        filter.setPriority(100);

会按照设置的Priority来先后调用注册的receiver。高等级的receiver可以调用abortBroadcast();来阻止下面的接收到这个广播。

  1. 本地广播
    这个其实就是为了不让其他APP跟我们这边APP进行通信处理。使用方法如下
public static void sendLocalBroadcast(Intent intent) {
    LocalBroadcastManager.getInstance(getInstance()).sendBroadcast(intent);
}
public static void registerLocalReceiver(BroadcastReceiver receiver, IntentFilter filter) {
    LocalBroadcastManager.getInstance(getInstance()).registerReceiver(receiver, filter);
}
public static void unregisterLocalReceiver(BroadcastReceiver receiver) {
    LocalBroadcastManager.getInstance(getInstance()).unregisterReceiver(receiver);
}
  1. Sticky广播
            现已经废弃。

使用广播遇到的问题

        其实广播的分类应该还有一个系统广播,这个广播由系统发出,比如开机广播。之所以没在上面进行介绍,是因为这个广播在android 8.0新特性中有了一些新的规定。部分通过静态注册的系统广播不再可以进行接受。因为静态广播的注册一直是在后台消耗一定资源的。通过动态注册可以解决这个问题。 当然还有发送的intent设置FLAG_RECEIVER_EXCLUDE_BACKGROUND;时候也不能接收到广播,8.0之后intent设置值的时候需要带上

setComponent.png

贴图片是为了更好的看懂两个参数是什么。
       查看一下 RECEIVER_EXCLUDE_BACKGROUND,发现对应的Flag: FLAG_RECEIVER_INCLUDE_BACKGROUND = 0x01000000;即我们可以通过intent.addFlags(0x01000000);也可以进行突破限制 实现广播的正常使用。

你可能感兴趣的:(Android Broadcast)