「这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战」
简介
Android应用与Android系统和其他应用之间可以相互收发广播消息,类似发布-订阅设计模式。
使用场景
- 同一App内部的同一组件内的消息通信(线程间)
- 同一App内部的不同组件直接
- 同一App多个进程之间
- 不同App的组件直接
- Android系统在特定的情况下与App之间
流程
- 广播接受者BroadcastReceiver通过Binder机制想AMS(Activit Manager Service)进行注册
- 广播发送至通过binder机制向AMS发送广播
- AMS查找复合条件的BroadcastReceiver,将广播内容发送到BroadcastReceiver的消息循环队列中
- 消息循环队列拿到广播后,回调BroadcastReceiver中的onReceiver方法
广播注册
静态注册
<receiver android:enabled=["true" | "false"]
android:exported=["true" | "false"]
android:icon="drawable resource"
android:label="string resource"
android:name="string"
android:permission="string"
android:process="string" >
. . .
<intent-filter>
<action android:name="string" />
</intent-filter>
</receiver>
exported:是否接收其他App发出的广播,默认值由intent-filter决定
name:BroadcastReceiver类名
permission:设置权限,具有相应权限的广播发送方才能被接收
process:receiver所在线程
动态注册
registerReceiver(BroadcastReceiver receiver,
IntentFilter filter)
registerReceiver(BroadcastReceiver receiver,
IntentFilter filter,
String broadcastPermission,
Handler scheduler)
Activity中
//动态注册广播
mBroadcastReceiver = new MyBroadcastReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(BROADCAST_ACTION);
registerReceiver(mBroadcastReceiver, intentFilter);
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//...
}
}
//销毁,反注册
unregisterReceiver(mBroadcastReceiver);
广播接收
广播接收器是运行在UI线程中的,因此,onReceive方法中不能执行太耗时的操作,否则将引起ANR。
广播的发生及广播类型
广播发送的载体其实是Intent,广播的定义过程,实际是相应的广播Intent的定义过程,然后通过广播将这个Intent发送出去。
广播类型
- 普通广播
- 系统广播
- 有序广播
- 应用内广播
普通广播
开发者自定义Intent,以context.sendBroadcast形式
Intent muIntent = new Intent();
muIntent.setAction("KING_BROAD");
muIntent.putExtra("msg", "normal");
sendBroadcast(muIntent);
系统广播
Android系统内置广播
有序广播
有序是针对广播接收者来说,指发送出去的广播被BroadcastReceiver按照先后顺序接收,有序广播的定义过程与普通广播无异,发送方式变为:
sendOrderedBroadcast
有序广播特点如下:
1.BroadcastReceiver接收有序广播是,按照先后顺序接收,顺序遵循:priority属性的值(-1000到1000),相同的priority,动态注册>静态注册
2.先接收到广播的receiver可以进行拦截,使用abortBroadcast()方法;也可以通过setResultExtras方法将处理结果存入到对象中,后续接收者使用getResultExtras获取
应用内广播
是一种局部广播,广播的发送者、接受者都是同一App。
/**注册应用内广播接收器*/
mBroadcastReceiver = new MyBroadcastReceiver();//自定义receiver
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(BROADCAST_ACTION_LOCAL);
localBroadcastManager = LocalBroadcastManager.getInstance(this);
localBroadcastManager.registerReceiver(mBroadcastReceiver, intentFilter);
//取消注册应用内广播接收器
localBroadcastManager.unregisterReceiver(mBroadcastReceiver4);
只能通过动态注册获取
补充
onReceiver(context, intent)中的context具体类型
1.静态注册:context为ReceiverRestrictedContext
2.全局动态注册:Activity Context
3.LocalBroadcastReceiver:Application context
\