版权声明:本文为博主原创文章,未经博主允许不得转载。https://blog.csdn.net/chengxu_kuangrexintu/article/details/82931755

BroadcastReceiver

定义

中文意思“广播接收者”,是一个全局的监听器,属于Android四大组件之一。

使用场景

  1. 同一个App内部的同一组件内的消息通信(单个或者多个线程之间);
  2. 同一个App内部的不同组件之间的消息通信(单个进程);
  3. 同一个App具有多个进程的不同组件之间的消息通信;
  4. 不同App之间的组件之间消息通信;
  5. Android系统在特定的情况下与App之间的消息通信。

BroadcastReceiver的注册

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

1.静态注册

注册方式:在AndroidManifest.xml里通过<receive>标签声明;
属性说明:

<receiver
    android:enabled=["true" | "false"]
	// 此broadcastReceiver能否接收其他App的发出的广播
	// 默认值是由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
    //此广播接收者类是MyBroadcastReceiver
    android:name=".MyBroadcastReceiver" >
    //用于接收网络状态改变时发出的广播
    <intent-filter>
        <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
    </intent-filter>
</receiver>

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

2.动态注册

注册方式:在代码中调用Context.registerReceiver()方法。
示例代码:

//  选择在Activity生命周期方法中的onResume()中注册
@Override
  protected void onResume(){
      super.onResume();

    //  1. 实例化BroadcastReceiver子类 &  IntentFilter
     mBroadcastReceiver mBroadcastReceiver = new mBroadcastReceiver();
     IntentFilter intentFilter = new IntentFilter();

    //  2. 设置接收广播的类型
    intentFilter.addAction(android.net.conn.CONNECTIVITY_CHANGE);

    //  3. 动态注册:调用Context的registerReceiver()方法
     registerReceiver(mBroadcastReceiver, intentFilter);
 }


 // 注册广播后,要在相应位置记得销毁广播,否则程序会出现报错
 // 即在onPause() 中unregisterReceiver(mBroadcastReceiver)
 // 当此Activity实例化时,会动态将MyBroadcastReceiver注册到系统中
 // 当此Activity销毁时,动态注册的MyBroadcastReceiver将不再接收到相应的广播。
 @Override
 protected void onPause() {
     super.onPause();
      //销毁在onResume()方法中的广播
     unregisterReceiver(mBroadcastReceiver);
     }
}

总结

  1. 动态注册广播不是常驻型广播,也就是说广播跟随Activity的生命周期。注意在Activity结束前,移除广播接收器。静态注册是常驻型,也就是说当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行;
  2. 当广播为有序广播时:优先级高的先接收(不分静态和动态)。同优先级的广播接收器,动态优先于静态;
  3. 同优先级的同类广播接收器,静态:先扫描的优先于后扫描的,动态:先注册的优先于后注册的;
  4. 当广播为默认广播时:无视优先级,动态广播接收器优先于静态广播接收器。同优先级的同类广播接收器,静态:先扫描的优先于后扫描的,动态:先注册的优先于后册的。
10-03 15:06