前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android:BroadcastReceiver广播注册方式汇总

Android:BroadcastReceiver广播注册方式汇总

作者头像
Carson.Ho
发布2019-02-22 10:20:21
2.5K0
发布2019-02-22 10:20:21
举报
文章被收录于专栏:Android知识分享Android知识分享

Android:BroadcastReceiver注册的方式分为两种:

  • 静态注册
  • 动态注册

1. 静态注册

  • 在AndroidManifest.xml里通过标签声明
  • 属性说明:
代码语言:javascript
复制
<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>
  • 注册示例
代码语言:javascript
复制
<receiver 
    //此广播接收者类是mBroadcastReceiver
    android:name=".mBroadcastReceiver" >
    //用于接收网络状态改变时发出的广播
    <intent-filter>
        <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
    </intent-filter>
</receiver>

当此App首次启动时,系统会自动实例化mBroadcastReceiver类,并注册到系统中。

2. 动态注册

在代码中通过调用Context的registerReceiver()方法进行动态注册BroadcastReceiver,具体代码如下:

代码语言:javascript
复制
@Override
  protected void onResume(){
      super.onResume();

    //实例化BroadcastReceiver子类 &  IntentFilter
     mBroadcastReceiver mBroadcastReceiver = new mBroadcastReceiver();
     IntentFilter intentFilter = new IntentFilter();

    //设置接收广播的类型
     intentFilter.addAction(android.net.conn.CONNECTIVITY_CHANGE);

    //调用Context的registerReceiver()方法进行动态注册
     registerReceiver(mBroadcastReceiver, intentFilter);
 }


//注册广播后,要在相应位置记得销毁广播
//即在onPause() 中unregisterReceiver(mBroadcastReceiver)
//当此Activity实例化时,会动态将MyBroadcastReceiver注册到系统中
//当此Activity销毁时,动态注册的MyBroadcastReceiver将不再接收到相应的广播。
 @Override
 protected void onPause() {
     super.onPause();
      //销毁在onResume()方法中的广播
     unregisterReceiver(mBroadcastReceiver);
     }
}

3. 两种注册方式的区别

注册方式的区别
注册方式的区别

4. 特别注意

  • 动态广播最好在Activity的onResume()注册、onPause()注销。
  • 原因:
    1. 对于动态广播,有注册就必然得有注销,否则会导致内存泄露 重复注册、重复注销也不允许
    2. Activity生命周期如下:
Activity生命周期
Activity生命周期

Activity生命周期的方法是成对出现的: - onCreate() & onDestory() - onStart() & onStop() - onResume() & onPause()

在onResume()注册、onPause()注销是因为onPause()在App死亡前一定会被执行,从而保证广播在App死亡前一定会被注销,从而防止内存泄露。

  1. 不在onCreate() & onDestory() 或 onStart() & onStop()注册、注销是因为: 当系统因为内存不足(优先级更高的应用需要内存,请看上图红框)要回收Activity占用的资源时,Activity在执行完onPause()方法后就会被销毁,有些生命周期方法onStop(),onDestory()就不会执行。当再回到此Activity时,是从onCreate方法开始执行。
  2. 假设我们将广播的注销放在onStop(),onDestory()方法里的话,有可能在Activity被销毁后还未执行onStop(),onDestory()方法,即广播仍还未注销,从而导致内存泄露。
  3. 但是,onPause()一定会被执行,从而保证了广播在App死亡前一定会被注销,从而防止内存泄露。
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016年11月14日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 静态注册
  • 2. 动态注册
  • 3. 两种注册方式的区别
  • 4. 特别注意
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档