Android 广播

  1. 应用场景
    组件间的通信
    多线程间的通信
    与android系统在特定情况下通信

  2. 按发送方式分类
    标准广播(Content.sendBroadcast()):广播发送出去后,所有的广播接收者几乎是同一时间收到广播消息,没有先后顺序之分,这种广播不会被截断
    有序广播(sendorderedBroadcast()):同一时刻只有一个广播接收者收到广播消息,当执行完广播逻辑后才向后传播。这种广播允许被截断

  3. 按注册方式分类

动态注册广播:代码中注册
BroadcastReceiver receiver = new BroatcastReceiver();
IntentFilter intentfilter = new IntentFilter();
intentfilter.addAction("COM.ANDROID.MYACTION");
Content.resgisterReceiver(receiver, intentFilter);
静态注册广播:manifest.xml中注册
<receiver
    android:name="包名+广播接收者类名">
    <intent-filter>
        <action android:name="">
    </intent-filter>
</receiver>
  1. 注册广播的几个相关属性
android:exported 能否接收其他APP发出的广播
(默认值由有无intent-filter决定,有,则默认为true,否则为false)
android:permission 若设置了,则具有相应权限的广播发送方发送的广播才能被此接收者接收
android:process 接收者运行所处的进程。默认为APP的进程。
可以指定独立的进程
  1. 动态静态广播的区别
    静态注册:即使APP退出了,仍然可以接收到广播
    动态注册:当Activity退出,就接收不到广播了

  2. 广播安全性问题,方案
    1、对于同一APP内部发送接收的广播,设置属性exported=“false”
    2、在广播发送和接收时,都增加相应的permission
    3、发送广播时,指定特定接收器所在的包名intent.setPackage(包名)
    4、采用LocalBroadcastManager的方式

  3. ANR问题
    在主线程上运行时,不能再其中执行长时间运行操作(允许10秒内的操作)
    不能再onReceive()的实现中启动一个弹出对话框

猜你喜欢

转载自blog.csdn.net/qq_27256793/article/details/79688390