美文网首页Android 知识点
BroadcastReceiver注册方式与区别

BroadcastReceiver注册方式与区别

作者: 怡红快绿 | 来源:发表于2018-12-25 17:01 被阅读0次

    广播作为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 的方法。

    相关文章

      网友评论

        本文标题:BroadcastReceiver注册方式与区别

        本文链接:https://www.haomeiwen.com/subject/dwvflqtx.html