欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android四大组件之BroadcastReceiver详解

程序员文章站 2022-06-23 14:57:44
broadcastreceiver(广播接收器),在android开发中,broadcastreceiver的应用场景非常多,属于android四大组件之一。 andro...

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

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

一、 作用

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

应用场景:

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

二、实现原理

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

模型中有3个角色:

  • 消息订阅者(广播接收者)
  • 消息发布者(广播发布者)
  • 消息中心(ams,即activity manager service)

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

三、广播接收器注册

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

静态注册

在androidmanifest.xml里通过 标签声明

<receiver
 //此广播接收者类是mbroadcastreceiver
 android:name=".mbroadcastreceiver" >
 //用于接收网络状态改变时发出的广播
 <intent-filter>
   <action android:name="android.net.conn.connectivity_change" />
 </intent-filter>
</receiver>

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

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

动态注册

在代码中通过调用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);
}

注意:

动态广播最好在activity的onresume()注册、onpause()注销。

原因:

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

总结

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