在发送广播之前,我们还需要先定义一个广播接收器来准备接收这个广播,因此新建一个MyBroadcastReceiver,如下:
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.w("MyBroadcastReceiver","reecived MyBroadcastReceiver");
}
}
当接收到自定义广播的时候,就会打印这条log,然后就要在清单文件中对这个广播接收器进行修改:
<receiver
android:name=".BootCompleteReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
<receiver android:name=".MyBroadcastReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.doyoulove.MY_RECEIVER" />
</intent-filter>
</receiver>
</application>
上面的 广播接收器是
静态注册的,与自定义广播接受者非常类似,不要忘了注意权限的问题
可以看到,这里让
MyBroadcastReceiver接收一条名为
"com.doyoulove.MY_RECEIVER"
的广播,所以发送广播时,我们就需要发送这样的一条广播。
可以将发送广播添加到某一个按钮之类的点击事件中,
Intent intent=new Intent("com.doyoulove.MY_RECEIVER");
sendBroadcast(intent);这样所有监听这条广播的广播接收者都会收到消息,此时发出去的广播就是一条标准广播。同时可以在intent中携带一些数据传递给广播接收者。广播是一种可以跨进程的通信方式,这一点从接收系统广播就能看出来,因此我们应用发出的广播,其他应用也是可以收到的。然后就要说一下有序广播:只需要将
sendBroadcast 方法改成sendOrderedBroadcast方法,该方法接受两个参数,第一个参数,仍然是intent,第二个参数是一个与权限相关的字符串(传入null亦可)。此时的广播接收器是有先后顺序的,而且前面的广播接收器还可以将广播截断,以阻止其继续传播。
要在清单文件中注册的时候设定广播接收器的先后顺序,如下 <receiver
android:name=".MyBroadcastReceiver"
android:enabled="true"
android:exported="true">
<intent-filter android:priority="1000">
<action android:name="com.doyoulove.MY_RECEIVER" />
</intent-filter>
</receiver>
</application>
通过android
:priority来设置优先级,优先级越高越早接收到广播。如果在广播接收器的onReceive方法中调用了abortBroadcast方法,就表示将这条广播截断,后面的广播接收器将无法接受到这条广播。
温馨提示:不要在广播的onReceive()里面添加过多的逻辑或者耗时操作,因为在广播接收器中是不允许开启线程,当onReceive方法运行较长时间而没有结束,程序就会报错,因此广播接收器更多的是扮演一种打开程序其他组件的角色 比如启动一个服务,创建一条状态栏通知等。