专栏首页Android知识分享Android:BroadcastReceiver广播注册方式汇总

Android:BroadcastReceiver广播注册方式汇总

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

  • 静态注册
  • 动态注册

1. 静态注册

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

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

2. 动态注册

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

@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生命周期的方法是成对出现的: - 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死亡前一定会被注销,从而防止内存泄露。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Android四大组件:BroadcastReceiver史上最全面解析

    BroadcastReceiver,本质上是一个全局的监听器,属于Android四大组件之一。

    Carson.Ho
  • Android 多线程:这是一份详细的AsyncTask使用教程

    下面,我将用1个实例讲解 具体如何使用 `AsyncTask`

    Carson.Ho
  • Android多线程:继承Thread类 & 实现Runnable接口 使用解析(含实例教程)

    很多情况下,开发者会选择一种更加方便的方法去创建线程:**匿名类**

    Carson.Ho
  • Eclipse 下找不到或无法加载主类的解决办法

    有时候 Eclipse 会发神经,好端端的 project 就这么编译不了了,连 Hello World 都会报“找不到或无法加载主类(Exception in...

    用户1177713
  • Android 开发基础入门篇: 动态权限申请

    goolge为了保护用户隐私,在android 6.0开始,某些隐私权限,必须用户允许以后,内部程序方可使用

    杨奉武
  • Arcgis for Android 开发环境搭建(Android Studio篇)

    开发工具:Android Studio 2.1.2(mac版本) 开发环境:OS X EI Capitan 版本 10.11.5 Android系统要求:A...

    专注APP开发
  • 百度地图KEY的申请

    点击"创建应用",进入创建AK页面,输入应用名称,将应用类型改为:“Android SDK”:

    wust小吴
  • 搭建基于Android和PhoneGap的开发环境

    添加ADT plug,地址为:http://dl-ssl.google.com/android/eclipse

    meteoric
  • 有了phonegap你还android吗?

    第一章 phonegap介绍 1.1 什么是phonegap PhoneGap是一个自由开放源码的开发工具和框架,允许利用HTML + JavaScript +...

    cloudskyme
  • Arcgis andoid开发之应用百度地图接口实现精准定位与显示

    怀着激动、兴奋的心情,在这个漫天柳絮的季节写下了这片博文,为什么呢,因为困扰我很久的一个技术性的问题得到了解决,发次博文,供大家参观、学习,同时,也以慰藉我长期...

    lzugis

扫码关注云+社区

领取腾讯云代金券