广播
广播机制
-
标准广播
一种完全异步执行的广播,在广播发出之后,所有的广播接收器几乎都在同一时刻接收到这条广播消息。它们之间没有先后顺序。因此,广播不可截断。
-
有序广播
一种同步执行的广播,广播发出后,同一时刻只会有一个广播接收器能接收到这条广播消息(有优先级的)。因此,广播可以被截断。
接受系统广播
系统内置许多广播,比如电池电量变化,时间时区变化,开机等等。
广播接收器有静态(AndroidManifest.xml中注册)和动态(代码中注册)两种注册方式。
- 动态注册
protectedvoid onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
IntentFilter intentFilter =newIntentFilter();
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
networkChangeReceiver =newNetworkChangeReceiver();
registerReceiver(networkChangeReceiver, intentFilter);
}
NetworkChangeReceiver是继承自BroadcastReceiver类的内部类。接受逻辑在onReceive方法中覆写。
- 静态注册
首先,新建一个继承自BroadcastReceiver的类BootCompleteReceiver。
然后,在AndroidManifest.xml中进行配置
<manifestxmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.broadcasttest"
android:versionCode="1"
android:versionName="1.0">
……
<uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permissionandroid:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<application>
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
……
<receiverandroid:name=".BootCompleteReceiver">
<intent-filter>
<actionandroid:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
</application>
</manifest>
所有静态的广播接收器都在<receiver>
标签中注册。注意<uses-permission>
标签指定了应用的权限。
- 两种方式优缺点
注册方式 | 优点 | 缺点 |
---|---|---|
动态注册 | 灵活,自由地控制注册和注销 | 必须在程序启动之后才能接收到广播 |
静态注册 | 未启动就可收到广播 | 不够灵活 |
发送自定义广播
- 发送标准广播
Intent intent =newIntent("com.example.broadcast.MY_BROADCAST");
sendBroadcast(intent);
- 发送有序广播
只需将sendBroadcast函数替换为sendOrderedBroadcast函数即可。
Intent intent =newIntent("com.example.broadcasttest.MY_BROADCAST");
sendOrderedBroadcast(intent,null);
第二个参数是一个与权限相关的字符串。
广播接收器的顺序需要在AndroidManifest.xml文件中定义
<receiverandroid:name=".MyBroadcastReceiver">
<intent-filterandroid:priority="100">
<actionandroid:name="com.example.broadcasttested.MyBROADCAST"/>
</intent-filter>
</receiver>
优先级高的广播接收器会先执行。
在接收器中可以选择是否截断广播
在接收器中调用abortBroadcast();
本地广播
使用LocalBroadcastManager来对广播进行管理,提供发送广播和注册广播接收器的方法。
localBroadcastManager =LocalBroadcastManager.getInstance(this);//获得实例
localBroadcastManager.sendBroadcast(intent);//发送本地广播
localBroadcastManager.registerReceiver(localReceiver, intentFilter);//注册
localBroadcastManager.unregisterReceiver(localReceiver);