应用场景
组件间的通信
多线程间的通信
与android系统在特定情况下通信按发送方式分类
标准广播(Content.sendBroadcast()):广播发送出去后,所有的广播接收者几乎是同一时间收到广播消息,没有先后顺序之分,这种广播不会被截断
有序广播(sendorderedBroadcast()):同一时刻只有一个广播接收者收到广播消息,当执行完广播逻辑后才向后传播。这种广播允许被截断按注册方式分类
动态注册广播:代码中注册
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>
- 注册广播的几个相关属性
android:exported 能否接收其他APP发出的广播
(默认值由有无intent-filter决定,有,则默认为true,否则为false)
android:permission 若设置了,则具有相应权限的广播发送方发送的广播才能被此接收者接收
android:process 接收者运行所处的进程。默认为APP的进程。
可以指定独立的进程
动态静态广播的区别
静态注册:即使APP退出了,仍然可以接收到广播
动态注册:当Activity退出,就接收不到广播了广播安全性问题,方案
1、对于同一APP内部发送接收的广播,设置属性exported=“false”
2、在广播发送和接收时,都增加相应的permission
3、发送广播时,指定特定接收器所在的包名intent.setPackage(包名)
4、采用LocalBroadcastManager的方式ANR问题
在主线程上运行时,不能再其中执行长时间运行操作(允许10秒内的操作)
不能再onReceive()的实现中启动一个弹出对话框