🔥 Hi,我是小余。
本文已收录到 GitHub · Androider-Planet 中。这里有 Android 进阶成长知识体系,关注公众号 [小余的自习室] ,在成功的路上不迷路!
BroadcastReceiver使用方式
注册方式:
静态注册和动态注册
- 1.1:静态注册:
伪代码:
1.创建一个BroadcastReceiver
class TestReceiver extends BroadcastReceiver{
field String userAction = "myaction";
method onReceive(intent){
if(userAction.equals(intent.getAction)){
doSomething();
}
}
}
2.在manfest中注册
<Receiver
name = "TestReceiver">
<intenFilter
action = "myaction"
/>
>
1.2: 动态注册
伪代码:
1.创建一个BroadcastReceiver
class TestReceiver extends BroadcastReceiver{
field String userAction = "myaction";
method onReceive(intent){
if(userAction.equals(intent.getAction)){
doSomething();
}
}
}
2.在Activity中:
rigister():
IntentFilter filter = new IntentFilter();
filter.addAction(myaction);
registerReceiver(TestReceiver,filter);
send():
intent.setAction();设置action
intent.putExtras();设置传输的数据
sendBroadcast(intent); 发送广播
动态注册的过程说明:
1.广播接收者通过binder机制在AMS注册(注册)
2.广播发送者通过binder机制像AMS发送广播(发送)
3.AMS在注册的广播列表中寻找对应的广播接收者,寻找依据:IntentFilter和permission(寻找)
4.AMS将广播发送到合适的广播接收者对应的消息循环列表中(放入)
5.广播接收者通过消息循环,回调onReceive方法(处理)
广播分类
(1)Normalbroadcasts:默认广播
(2)orderedbroadcasts:有序广播
-
1.默认广播
发送一个默认广播使用Context.
sendBroadcast()方法, 普通广播对于多个接收者来说是完全异步的, 通常每个接收者都无需等待即可以接收到广播,接收者相互之间不会有影响。 对于这种广播,接收者无法终止广播,即无法阻止其他接收者的接收动作 -
2.有序广播
2.1: 发送一个有序广播使用Context.
sendorderedBroadcast()方法, 有序广播比较特殊,它每次只发送到优先级较高的接收者那里,然后由优先级高的接受者再传播到优先级低的接收者那里,优先级高的接收者有能力终止这个广播。2.2: 通过设置
IntentFilter中的android:priority属性,可以设置广播接受者的优先级优先级越高最先接收到广播2.3: 使用
setResultExtras方法将一个Bundle对象设置为结果集对象,传递到下一个接收者那里, 这样优先级低的接收者可以用getResuttExtras获取到最新的经过处理的信息集合2.4: 使用
sendorderedBroadcast方法发送有序广播时,需要一个权限参数,接收者在manfest中声明
如果为
null则表示不要求接收者声明指定的权限, 如果不为null则表示接收者若要接收此广播,需声明指定权限。 这样做是从安全角度考虑的,例如系统的短信就是有序广播的形式,一个应用可能是具有拦截垃圾短信的功能,当短信到来时它可以先接受到短信广播,
必要时终止广播传递,这样的软件就必须声明接收短信的权限
3.广播测试
3.1:使用普通无序广播,动态广播优先级比静态广播高,静态广播根据优先级调用
在`8.0`以后屏蔽了隐式广播发送,如果需要使用要在发送广播时加上包名即可
3.2:使用有序广播时,广播按优先级有序发送
-
总结:静态广播和动态广播的区别:
1.
静态广播是常驻型广播,应用退出后如果有其他应用发送了符合该广播条件也会自动运行.2.
动态广播随注册的Activity或其他组件的生命周期,组件生命周期结束,广播生命周期也结束.两种发送方式的
区别:1.无序发送:
不同类型的广播:无视优先级,动态优先于静态 同类型的广播 : 优先级高先接收到,优先级相等,根据注册的顺序执行2.有序广播:
不同类型的广播:根据优先级接收,优先级相等先执行动态广播 同类型的广播: 根据优先级接收,优先级相等根据注册的先后顺序执行发送和接收权限声明:
1.发送者需要接收者有权限: 1.1:sendOrderedBroadcast(intent, "com.android.permission.yourdiyname"); 1.2:发送者创建权限:<permission android:name="com.android.permission.yourdiyname" /> 1.3:接收者声明权限:<uses-permission android:name="com.android.permission.yourdiyname" /> 2.接收者需要发送者有权限: 1.1:接收者创建权限: <permission android:name="com.android.permission.yourdiyname" /> <receiver android:name=".YourDiyReceiver" android:permission="com.android.permission.yourdiyname"> <intent-filter> <action android:name="com.android.YOUR_DIY_ACTION" /> </intent-filter> </receiver> 1.2:发送者声明权限: <uses-permission android:name="com.android.permission.yourdiyname" />
注意:动态注册的广播一定要在组件退出的时候,解除注册信息,防止出现OOM