BroadcastReceiver 详解

(3) 2024-05-13 11:23

Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说BroadcastReceiver 详解,希望能够帮助你!!!。

一、定义

BroadcastReceiver,广播接收器,是四大组件之一。是全局(一般情况下,应用内广播可认为是局
部广播,将exported属性设置为false)的监听器,Android 广播分为两个角色:广播发送者和广
播接收者。

二、应用场景

a.不同组件之间的通信(包括应用内和应用之间)

b.与Android系统在特定情况下的通信

c.线程之间的通信

三、生命周期

当一个broadcast信息到达该receiver,Android调用它的onReceive()方法并将含有该广播信息

的intent 对象传递它。Broadcast receiver仅仅在执行该方法时才被认为是活跃的。当

onReceive()返回后,它又处于非活跃状态。也就是说,它的生命周期为从回调onReceive()方

法开始到该方法返回结果后结束。最长只有10秒,所以我们不能再OnReceive()中做耗时的任

务,可以将耗时的任务转移到服务中进行。

四、实现原理

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

五、广播的两种注册方式:静态注册和动态注册

  • 静态注册

是在配置文件AndroidManifest.xml里通过**标签声明receiver 标签声明

属性值说明

<receiver  //这个属性用于定义系统是否能够实例化这个广播接收器,如果设置为true,则能够实例化,如果设置为false,则不能被实例化。默认值是true。
    android:enabled=["true" | "false"] //这个属性用于指示该广播接收器是否能够接收来自应用程序外部的消息,如果设置true,则能够接收,如果设置为false,则不能够接收。如果 //设置为false,这该接收只能接收那些由相同应用程序组件或带有相同用户ID的应用程序所发出的消息。 //默认值是由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类,并注册到系统中。
  • 动态注册

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

注意:动态注册的广播,在它依附的上下文销毁之前注销广播注册,否则会导致内存泄露。

  • 静态注册和动态注册的区别

静态注册:常驻型广播;不受到任何组件的生命周期影响;应用场景是需要时刻监听的广播;

动态注册:非常驻型广播;跟随注册它的组件的生命周期,使用灵活,在组件生命周期结束前

必须注销广播;应用场景是在特定时刻需要监听的广播。

六、广播的类型

*普通广播
*有序广播
*粘性广播
*系统广播
*App应用内广播

注意:

1.粘性广播在Android5.0已经废弃,不建议再使用该广播。

2.可以在onReceive()中通过isOrderdBroadcast()方法判断是否是有序广播,该方法是

BroadcastReceiver类中提供的方法,返回boolean型值,用于判断是否是有序广播。

今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

上一篇

已是最后文章

下一篇

已是最新文章

发表回复