基础原理
采用观察者模式:基于消息的发布/订阅事件模型 分为三个角色:①消息订阅者(广播接收者)②消息发布者(广播发布者)③消息中心
基本流程: ①广播接收者 在 消息中心 进行注册 ②广播发布者 先向 消息中心 发送广播 ③消息中心 依据 广播发布者 要求筛选 接收者 ④消息中心 将广播发送到合适 接收者 的消息队列中 ⑤广播接收者 通过消息循环拿到广播,调用onReceive
使用流程
自定义广播接收者BroadcastReceiver
要求: ①继承BroadcastReceiver基类 ②必须复写抽象方法onReceive()
public class mBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
}
}
注:onReceive中不应执行耗时操作(广播接收器运行在UI线程)
广播接收器注册
静态注册
在AndroidManifest中用标签声明
<receiver
android:enabled=["true" | "false"]
//此broadcastReceiver能否接收其他App的发出的广播
//默认值是由receiver中有无intent-filter决定的:如果有intent-filter,默认值为true,否则为false
android:exported=["true" | "false"]
android:icon="drawable resource"
android:label="string resource"
//继承BroadcastReceiver子类的类名
android:name=".mBroadcastReceiver"
//具有相应权限的广播发送者发送的广播才能被此BroadcastReceiver所接收;
android:permission="string"
//BroadcastReceiver运行所处的进程
//默认为app的进程,可以指定独立的进程
//注:Android四大基本组件都可以通过此属性指定自己的独立进程
android:process="string" >
//用于指定此广播接收器将接收的广播类型
//本示例中给出的是用于接收网络状态改变时发出的广播
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
配置好后,当APP首次启动时,系统会自动实例化mBroadcastReceiver并注册
动态注册
在代码中调用Context.registerReceiver()方法
@Override
protected void onResume(){
super.onResume();
mBroadcastReceiver mBroadcastReceiver = new mBroadcastReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(android.net.conn.CONNECTIVITY_CHANGE);
registerReceiver(mBroadcastReceiver, intentFilter);
}
@Override
protected void onPause() {
super.onPause();
unregisterReceiver(mBroadcastReceiver);
}
}
注:①动态广播最好在onResume中注册,在onPause中注销(①首先保证不发生内存泄漏,需要进行注册、注销成对出现 ②在生命周期中,onResume和onPause是成对出现的,并且此处会保证广播在APP执行时一定会注册,死亡时一定被注销(系统有时需要腾出内存执行更高优先级任务时,Activity会在执行onStop后就销毁,并不会执行到onStop和onDestroy,所以在onStop中注销)) ②上述两种注册方式,动态更为灵活,可以用于特定时期获取广播时使用;静态注册的广播会持续运行,用在需要时刻保持广播获取时使用
广播发送分类
普通广播
开发者自定义intent的广播。 发送:
Intent intent = new Intent();
intent.setAction(BROADCAST_ACTION);
sendBroadcast(intent);
接收:
<receiver
android:name=".mBroadcastReceiver" >
<intent-filter>
<action android:name="BROADCAST_ACTION" />
</intent-filter>
</receiver>
系统广播
系统广播涉及手机的基本操作(开关机、网络变化等),都有特定的intent-fliter。 例如:监听网络变化(android.net.conn.CONNECTIVITY_CHANGE)等 在使用系统广播时,只需要在注册时设置对应的action即可,不需要用户手动发送广播
有序广播
该广播会被广播接收者按先后顺序接收 顺序规则:①按照Priority属性从大-小排序(相同时,动态注册的广播优先) 特点: ①广播会按顺序接收 ②先接收的广播接收者可以截断 ③先接收的广播接收者可以对广播进行修改,那么后接收到的接收修改后的广播 具体使用: 和普通广播相同,只是发送方式不同
sendOrderedBroadcast(intent);
App应用内广播
安卓广播可以跨App通信,那么会导致不同app中若有相同intent-fliter,导致广播出问题 使用: ①将全局广播设置为局部广播: a.注册时将exported设置为false,即非本app内部发出的广播不被接收 b.广播发送和接收时设置响应权限permission,用于权限验证 c.发送广播时指定广播接收器所在的包名intent.setPackage(packageName) ②用封装好的LocalBroadcastManager 该类只能动态注册
mBroadcastReceiver = new mBroadcastReceiver();
IntentFilter intentFilter = new IntentFilter();
localBroadcastManager = LocalBroadcastManager.getInstance(this);
intentFilter.addAction(android.net.conn.CONNECTIVITY_CHANGE);
localBroadcastManager.registerReceiver(mBroadcastReceiver, intentFilter);
localBroadcastManager.unregisterReceiver(mBroadcastReceiver);
Intent intent = new Intent();
intent.setAction(BROADCAST_ACTION);
localBroadcastManager.sendBroadcast(intent);
粘性广播
注意事项
在onReceive(Context context, Intent intent)中context返回值不同: ①静态注册:返回的是ReceiverRestrictedContext ②全局广播的动态注册:返回的是ActivityContext ③应用内的动态注册(封装类):返回的是ApplicationContext ④应用内的动态注册(非封装类):返回的是ActivityContext
|