前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android四大组件之BroadcastReceiver详解

Android四大组件之BroadcastReceiver详解

作者头像
砸漏
发布2020-11-04 11:17:58
8640
发布2020-11-04 11:17:58
举报
文章被收录于专栏:恩蓝脚本

BroadcastReceiver(广播接收器),在Android开发中,BroadcastReceiver的应用场景非常多,属于Android四大组件之一。

Android 广播分为两个角色:广播发送者、广播接收者

一、 作用

用于监听 / 接收 应用发出的广播消息,并做出响应

应用场景:

  • 不同组件之间通信(包括应用内 / 不同应用之间)
  • 与 Android 系统在特定情况下的通信(如当电话呼入时、网络可用时)
  • 多线程通信

二、实现原理

Android中的广播使用了设计模式中的观察者模式:基于消息的发布/订阅事件模型。

模型中有3个角色:

  • 消息订阅者(广播接收者)
  • 消息发布者(广播发布者)
  • 消息中心(AMS,即Activity Manager Service)

广播接收者通过 Binder机制在AMS注册 广播发送者通过 Binder 机制向AMS发送广播 AMS根据广播发送者要求,在已注册列表中,寻找合适的广播接收者(寻找依据:IntentFilter / Permission) AMS将广播发送到合适的广播接收者相应的消息循环队列中; 广播接收者通过消息循环拿到此广播,并回调 onReceive()

三、广播接收器注册

注册的方式分为两种:静态注册、动态注册

静态注册

在AndroidManifest.xml里通过 标签声明

代码语言:javascript
复制
<receiver
 //此广播接收者类是mBroadcastReceiver
 android:name=".mBroadcastReceiver"  
 //用于接收网络状态改变时发出的广播
 <intent-filter 
   <action android:name="android.net.conn.CONNECTIVITY_CHANGE" / 
 </intent-filter 
</receiver 

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

静态注册是常驻广播,不受任何组件生命周期的影响

动态注册

在代码中通过调用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将不再接收到相应的广播。

代码语言:javascript
复制
@Override
protected void onPause() {
  super.onPause();
  //销毁在onResume()方法中的广播
  unregisterReceiver(mBroadcastReceiver);
}

注意:

动态广播最好在Activity的onResume()注册、onPause()注销。

原因:

对于动态广播,有注册就必然得有注销,否则会导致内存泄露 重复注册、重复注销也不允许 动态注册是非常驻广播,灵活,跟随组件的生命周期变化。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对ZaLou.Cn的支持。如果你想了解更多相关内容请查看下面相关链接

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-09-11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档