类型
Android中的广播主要分为两类:标准广播和有序广播。
- 标准广播是一种完全异步执行的广播,发出后所有广播接收器几乎同时接收到这条广播,该类型广播无法被截断。
- 有序广播是一种同步执行的广播,在广播发出后同一时刻只有一个广播接收器能够接收到这条广播消息。优先级高的广播接收器先收到广播消息,并能截断正在传递的广播。
接收广播
注册方式分两种:在代码中注册(动态注册)以及在AndroidManifest.xml中注册(静态注册)
动态注册
- 创建一个广播接收器类,继承于BroadcastReceiver,并重写父类的onReceive()方法。
- 创建一个intentFilter实例,并为其添加相应地action(想要监听什么广播,就添加相应的action)
- 最后调用registerReceiver(BroadcastReceiver receiver, IntentFilter intentFilter)方法完成注册。
- 动态注册的广播接收器一定要取消注册,unregisterReceiver()
若涉及一些敏感操作,则需在配置文件中声明权限才可以,如< uses-permission android:name=”android.permission.ACCESS_NETWORK_STATE”/>
静态注册
- 同动态注册第1步,创建一个广播接收器类
- 在AndroidManifest中注册,示例:
<receiver
android:name=".MyReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<actoin android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
android.intent.action.BOOT_COMPLETED为系统开机完成后发出的一条广播
发送广播
发送标准广播
Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");
sendBroadcast(intent);
发送有序广播
Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");
sendOrderedBroadcast(intent, null);
可见有序广播和标准广播只有一行差别。sendOrderedBroadcast()接收两个参数,第一个仍是Intent,第二个参数是一个与权限相关的字符串。
而接收器的优先级相关设置如下:
<receiver
android:name=".MyReceiver"
android:enabled="true"
android:exported="true">
<intent-filter android:priority="100">
<actoin android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
优先级高的广播接收器可以先收到广播,调用abortBroadcast()方法可以将广播截断,后面的广播接收器将无法再接收到这条广播。
使用本地广播
- 本地广播是无法通过静态注册的方式来接收的。
- 本地广播不会离开我们的程序,不必担心机密数据泄露
- 其他的程序无法将广播发送到我们程序的内部
- 发送本地广播比发送系统全局广播更高效。
用法:主要使用一个LocalBroadcastManager来对广播进行管理。如:
LocalBroadcastManager localBroadcastManager;
localBroadcastManager = LocalBroadcastManager.getInstance(this);
//发送本地广播
Intent intent = new Intent("com.example.broadcasttest.LOCAL_BROADCAST");
localBroadcastManager.sendBroadcast(intent);
//注册接收本地广播
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("com.example.broadcasttest.LOCAL_BROADCAST");
LocalReceiver localReceiver = new LocalReceiver();//先定义好LocalReceiver类
localBroadcastManager.registerReceiver(localReceiver, intentFilter);