2019-05-26

  关于广播

一、什么是广播接收者?

安卓的四大组件之一,分为发送者和接收者。是一个全局监听器。可以接收系统广播,也可以接收应用广播,你可以选择过滤掉你不想接收的消息,只接收你想接收的,然后做出响应。

  应用的场景:应用内或者不同应用之间、多线程通信、或者说与系统的通信,比如电话接入,网络可用时

  原理:使用了观察者模式,所以安卓让广播的发送和接受进行解耦,方便集成,更易扩展。

二、广播有5种分类:

普通广播:这个很简单,就是用intent发送标识,在处理广播那里进行过滤接收。

系统广播:可以接收到如电量过低、锁屏、插入耳机、监听网络变化等等

有序广播:发送的广播被广播接收者按先后顺序接收,根据Priority值大小接收,如果Priority值相同

动态注册的广播优先接收。它的特点是可以拦截广播或者修改广播,用来控制下一个广播接受者。

粘性广播:在安卓5.0中已经失效,不建议使用。

App应用内的广播:广播发送者和接收者同属一个App,它相比于普通广播更安全高效。

二、注册方式

作为Android四大组件之一的广播有两种注册方式:静态注册和动态注册。在注册之前,我们应该有自己的

BroadcastReceiver,即广播接收器,这样我们才能接收到广播,进行事务处理。

public class MyBroadCastReceiver extends BroadcastReceiver {

@Override

public void onReceive(Context context,Intent intent) {

  // 在此处处理事务

}

}

1、静态注册

  指的是在AndroidManifest.xml中用<receiver>标签进行注册,并在标签内用<intent-filter>标签设置过滤器,

例如<action>、<data>等。

<receiver android:name=".MyBroadCastReceiver">

<intent-filter>

<actionandroid:name="android.intent.action.PACKAGE_REMOVED"/>

<dataandroid:scheme="package"/>

</intent-filter>

</receiver>

2、动态注册

指的是在代码中进行注册,例如:

IntentFilter:负责过滤掉组件无法响应和处理的Intent,只将自己关心的Intent接收进行处理

IntentFilter filter = new IntentFilter(); 

filter.addAction(Intent.ACTION_PACKAGE_REMOVED);

filter.addDataScheme(“package”);

3、两种注册方式的区别和优缺点:

动态注册:生命周期与程序的生命周期一致,程序关闭后将接收不到广播。

静态注册:即使程序关闭也能接收到广播。

4、两种注册方式的优缺点:

动态注册:

(1)优点:优先级高于静态注册,优先收到广播。

(2)缺点:注册广播的Activity关闭,广播也将无法接收。

静态注册:

(1)优点:无需担心广播接收器是否被关闭,应用若未运行,将会被唤醒并接收广播。

(2)缺点:优先级较低。

三、广播的使用的注意事项

1、需要注意在自定义类继承于广播接受者时,在其回掉的onReceive()方法中,不可以做耗时操作,否则会产生ANR

2、在动态注册时,当不再需要广播接收器时,要记得注销unregisterReceiver(),否则可能引起内存泄露。

3、不可以重复的注册和注销

4、建议在onResume注册和在onPause方法中注销。可以防止内存泄漏,因为它在Activity销毁之前注销;

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容