广播作为Android四大组件的一员,在整个系统中扮演者很重要的角色。
广播注册的方式分为两种,静态注册和动态注册。
1、静态注册
直接在AndroidManifest.xml里通过<receive>标签声明。
使用示例
<receiver
android:name=".util.jiguang.JPushReceiver"
android:enabled="true"
android:exported="false">
<intent-filter>
<action android:name="cn.jpush.android.intent.REGISTRATION" />
<action android:name="cn.jpush.android.intent.MESSAGE_RECEIVED" />
<action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED" />
<action android:name="cn.jpush.android.intent.NOTIFICATION_OPENED" />
<action android:name="cn.jpush.android.intent.NOTIFICATION_CLICK_ACTION" />
<action android:name="cn.jpush.android.intent.CONNECTION" />
<category android:name="${JPUSH_PKGNAME}" />
</intent-filter>
</receiver>
当应用启动时,系统会自动实例化JPushReceiver类,并注册到广播系统中,这个步骤由系统自动完成。
静态注册广播的特点是:广播常驻后台,不会随着其他组件的消亡而变化。这样的话不仅占用内存,而且会增加应用的耗电量。
2、动态注册
在代码中调用Context.registerReceiver()方法完成注册。为了避免内存泄漏,当广播不再使用时,开发者需要手动注销广播。
使用示例
/*****注册广播*****/
// 1. 实例化BroadcastReceiver子类 & IntentFilter
JPushReceiver mBroadcastReceiver = new JPushReceiver();
IntentFilter intentFilter = new IntentFilter();
// 2. 设置接收广播的类型
intentFilter.addAction("XXX");
// 3. 动态注册:调用Context的registerReceiver()方法
registerReceiver(mBroadcastReceiver, intentFilter);
/*****注销广播*****/
if(mBroadcastReceiver!=null) {
unregisterReceiver(mBroadcastReceiver);
}
动态注册广播的特点是:注册和注销的过程需要开发者自己手动完成,生命周期灵活可控。
作为开发者必须要知道的是,随着Android系统的不断更新迭代,广播的发布规则也发生了一些变化。
- 在Android 7.0(API 24)及以上的版本,将不再使用系统广播中的 ACTION_NEW_PICTURE和ACTION_NEW_VIDEO
- 在Android 7.0(API 24)及以上的版本,监听CONNECTIVITY_ACTION广播时,需要使用registerReceiver(BroadcastReceiver, IntentFilter)方法,只在manifest文件中声明receiver将失效
- 从Android 8.0(API 26)开始,对于大部分隐式广播(广播的对象不是针对你开发的APP),不能在menifest中声明receiver,如果需要使用隐式广播,需要使用context-registered reciever 的方法。
网友评论