首页 > 系统 > Android > 正文

Android四大组件之BroadcastReceiver详解

2019-10-21 21:26:06
字体:
来源:转载
供稿:网友

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

@Overrideprotected 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将不再接收到相应的广播。

@Overrideprotected void onPause() {  super.onPause();  //销毁在onResume()方法中的广播  unregisterReceiver(mBroadcastReceiver);}

注意:

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

原因:

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

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对VEVB武林网的支持。


注:相关教程知识阅读请移步到Android开发频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表