美文网首页
Android Broadcast

Android Broadcast

作者: 就爱烫卷发 | 来源:发表于2019-03-31 12:04 被阅读0次

    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中注册:

      <receiver android:name=".TestReceiver"
         android:enabled="true" //表示可以接受到信息。
         android:exported="true">//表示可以接收到外部APK的信息
        <intent-filter>
            <action android:name="com.xxx.just_for_test"/>
        </intent-filter>
        </receiver>
    

            注意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越大优先级越高 静态:

             <intent-filter android:priority="100">
               <action android:name="com.xxx.just_for_test"/>
             </intent-filter>
      

    动态:

            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

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