BroadcastReceier内容探索
如何判断广播是有序还是无序
在BroadcastReceiver类中onReceiver()方法中可以调用boolean b = isOrderedBroadcast();
该方法是BroadcastReceiver类中提供的方法,用于高速我们当前的接收到的广播是否为有序广播。
boolean b = isOrderedBroadcast();
广播的优先级对无序广播是否生效
生效,广播的优先级推荐的范围是[-1000,1000],但是如果设置的优先级值超过这个范围也是可以的。
动态注册的广播谁的优先级高
谁先注册谁优先级高;
最终广播接收器(Final Receiver)
最终广播是自己应用发送有序广播时通过ContextWrapper.sendOrderedBroadcast()方法指定的当前应用下的广播,该广播可能会被执行两次,第一次是作为普通广播按照优先级接收广播,第二次是最终广播接收器必须接收一次。
四大组件是否都要在清单文件中注册
Activity、Service、ContentProvider必须在清单文件中进行注册;
BroadcastReceiver有静态注册和动态注册两种注册方式,静态注册是指在清单文件中进行注册,动态注册是通过Java代码进行注册。
如何让自己的广播只让指定的App接收
- 自己的应用在发送广播的时候给自己发送的广播添加自定义权限,然后在自己应用的AndroidManifest.xml中声明权限;
<permission
android:name="com.ms.android.permission"
android.protectionLevel="normal">
</permission>
<uses-permission android:name="com.ms.android.permission"
- 其他应用如果想接收该广播,那么就必须知道应用A广播的使用权限,然后在应用B的清单文件中配置。
<uses-permission android:name="com.ms.android.permission"/>
<receiver android:name="com.ms.android.broadcastReceiver.MyReceiver"
android:permission="com.ms.android.permission">
<intent-filter >
<action android:name="com.ms.mybroadcast"></action>
</intent-filter>
</receiver>
normal:低风险权限,只要申请了就可以使用,安装时不需要用户确认;
dangerous:高风险权限,安装时需要用户的确认才可使用;
signature:只有当申请权限的应用程序的数字签名与声明此权限的应用程序的数字签名相同时才能将权限授予它;
signatureOrSystem:签名相同,或者申请权限的应用为系统应用。
上述四类权限级别同样可用于自定义权限中。如果开发者需要对自己的应用程序进行访问控制,可以通过在AndroidManifest.xml中添加标签,将其属性中的protectionLevel设置为上述四类级别中的某一种来实现。
事件总线、观察者模式、广播的区别
Android的广播机制可以用来实现各种事件的监听,但它更适合用于监听Android系统级的广播事件(例如网络状态变化、电量变化等,对于业务相关的事件变化)。广播太重量级,使用也不方便,最佳实践应该是把BroadcastReceiver限定于监听系统级别的广播事件。
观察者模式可以用来监听简单的事件,但如果APP全局都使用观察者模式来解决组件和模块间的消息通信,那么可能会造成接口膨胀的问题。观察者模式要求开发者自己实现事件的生成、分发和处理,需要进行很好的设计。观察者模式不支持粘滞事件,不支持事件优先级等特性。性能上来说,观察者模式要比事件总线性能高。
事件总线使用方便,但不应该滥用,需要严格限定它的使用范围,只有在组件或者模块间通信时才使用它。对于简单的消息传递,就选用观察者模式或者事件回调的方式即可。