广播
广播
广播机制
-
标准广播
一种完全异步执行的广播,在广播发出之后,所有的广播接收器几乎都在同一时刻接收到这条广播消息。它们之间没有先后顺序。因此,广播不可截断。
-
有序广播
一种同步执行的广播,广播发出后,同一时刻只会有一个广播接收器能接收到这条广播消息(有优先级的)。因此,广播可以被截断。
接受系统广播
系统内置许多广播,比如电池电量变化,时间时区变化,开机等等。
广播接收器有静态(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);

浙公网安备 33010602011771号