Android BroadcastReceiver广播注册方式总结

 更新时间:2017年01月12日 09:53:20   投稿:lqh  
这篇文章主要介绍了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生命周期

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死亡前一定会被注销,从而防止内存泄露。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

相关文章

  • 深入解析Android中View创建的全过程

    深入解析Android中View创建的全过程

    这篇文章主要给大家深入的解析了关于Android中View创建的全过程,文中介绍的非常详细,相信对大家会有一定的参考借鉴,需要的朋友们下面来一起学习学习吧。
    2017-03-03
  • Android使用自定义属性实现图片自动播放滚动的功能

    Android使用自定义属性实现图片自动播放滚动的功能

    这篇文章主要介绍了Android使用自定义属性实现图片自动播放滚动的功能,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • 自定义toast外形,多次点击不会总是弹出toast的实现方法

    自定义toast外形,多次点击不会总是弹出toast的实现方法

    下面小编就为大家带来一篇自定义toast外形,多次点击不会总是弹出toast的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-04-04
  • Android 实现自己的LOG信息

    Android 实现自己的LOG信息

    本文主要讲解Android LOG,这里对如何创建自己的Android LOG信息做了详细的介绍,并附简单代码示例,有需要的小伙伴可以参考下
    2016-08-08
  • Android使用Handler实现打地鼠游戏

    Android使用Handler实现打地鼠游戏

    这篇文章主要为大家详细介绍了Android使用Handler实现打地鼠游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-06-06
  • Kotlin RadioGroup与ViewPager实现底层分页按钮方法

    Kotlin RadioGroup与ViewPager实现底层分页按钮方法

    安卓的控件是挺多的,没有办法一个一个的来说明,我们挑出了一些重点的控件,组成一些常见的布局,这样以后在遇到相同功能的界面时,就会有自己的思路,或者进行复用
    2022-12-12
  • Android仿支付宝密码输入效果封装

    Android仿支付宝密码输入效果封装

    这篇文章主要为大家详细介绍了Android仿支付宝密码输入效果的封装,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • Android中使用Kotlin实现一个简单的登录界面

    Android中使用Kotlin实现一个简单的登录界面

    Kotlin 是一种在 Java 虚拟机上运行的静态类型编程语言,被称之为 Android 世界的Swift,由 JetBrains 设计开发并开源。接下来本文通过实例代码给大家讲解Android中使用Kotlin实现一个简单的登录界面,一起看看吧
    2017-09-09
  • 基于将Android工程做成jar包和资源文件的解决方法

    基于将Android工程做成jar包和资源文件的解决方法

    有时候,我们希望将我们的Android工程提供给第三方开发者使用。这个时候,最普遍的做法,就是提供一个jar包和一堆资源文件,第三方开发者可以将资源文件拷贝到Android工程的相应目录下,同时引用我们提供的jar包,就可以使用我们提供的相应API了
    2013-05-05
  • Android UI组件LinearLayout线性布局详解

    Android UI组件LinearLayout线性布局详解

    这篇文章主要为大家详细介绍了AndroidUI组件LinearLayout线性布局,具有一定的实用性,感兴趣的小伙伴们可以参考一下
    2016-08-08

最新评论