Android中的广播分为两种类型标准广播和有序广播。
标准广播:
是一种完全异步执行的广播,广播发出后,所有的广播接收器几乎都会在同一时刻接收到这条广播消息,因此 他们之间没有任何先后顺序可言。而且这种广播效率较高,但是无法被截断。
我们使用静态注册的方式注册一个我们自己的标准广播
首先我们需要创建一个广播接收类,如果你用的是AS开发工具,右击你的包名->New->Other->Broadcast Receiver,去创建一个广播接收器,在这个页面上会有2个选项,Exported属性表示是否允许这个广播接收器接收本程 序以外的广播,Enable属性表示是否开启这个广播接收器。勾选这两个属性创建即可。
我们打开AndroidManifest文件,我们需要添加粗体部分的代码才能接收到 com.example.broadcasttest.MY_BROADCAST的广播,
<receiver
android:name=".MyBroadcastReceiver"
android:enable="true"
android:exported = "true">
<intent-filter>
<action android:name="com.example.broadcasttest.MY_BROADCAST">
</intent-filter>
</receiver>
那么你会问到那如何发送呢?
其实很简单,在你的Activity触发事件中如此写
Intent intent = new Intent("om.example.broadcasttest.MY_BROADCAST);
sendBroadcast(intent);
这样我们就发送了,接收到这条广播后我们就需要处理我们自己的逻辑,毫无疑问,这些都是写在广播接收器类中的onReceive()方法中的。想必你已经大概了解了发送一条自定义标准广播的流程了。
但是有一点需要注意,onReceive()方法不能添加过多的逻辑或者进行任何的耗时操作,因为在广播接收器中是不允许开线程的,当onReceive()方法云轻了较长时间而没有结束时,程序就会报错。因此广播接收器中更多的是打开其他组件,比如创建一条状态栏通知或者通知启动一个服务等。
还有一点需要注意,我们的这个例子是静态注册的广播接收器,是没有办法在onReceive()方法中弹出UI控件的,比如对话框,如果需要,请用动态注册方法。
我们来学习一下动态注册方法。
我们不需要在AndroidManifest中去注册,而是在Activity的onCreate()方法中去注册。 IntentFilter intentFilter = new IntentFilter();
intentfilter.addAction("om.example.broadcasttest.MY_BROADCAST")
MyBroadcastReceiver receiver = new MyBroadcastReceiver ();
registerReceiver(receiver,intentFilter);
但是最后一定要记得动态注册的广播接收器一定要取消注册才行,我们一般在onDestory()方法中调用unregusterReceiver()方法来实现的。
注:我们目前注册时自定义的广播,当然接收系统广播也如此,一样可以用动态注册和静态注册,具体看项目需求吧。
有序广播
是一种同步执行的广播,广播发出之后,同一时刻只会有一个广播接收器收到这条广播消息,当这个广播接收器中的逻辑执行完毕后,广播才会继续传递,也就说有序广播是有顺序的,优先级高的广播接收器不仅可以先收到广播消息,而且还可以截断正在传递的广播,这样后面的广播接收器就无法收到广播了。在哪里设定广播接收器的先后顺序?
<receiver
android:name=".MyBroadcastReceiver"
android:enable="true"
android:exported = "true">
<intent-filter android:priority="100">
<action android:name="com.example.broadcasttest.MY_BROADCAST">
</intent-filter>
</receiver>
我们可以通过android:priority属性设置优先级。
那么调用什么方法可以取消广播呢?
@override
public void onReceive(Context context, Intent intent) {
abortBroadcast();
}
如果你不想让后面的广播接收到,那么你可以调用abortBraodcast()方法,这样后面的广播就接收不到了。
本地广播LocalBroadcastManager
我们上述讲的都属于系统全局广播,也就是说发出的广播可以被其他任何应用程序接收到,我们也可以接收到其他任何应用程序的广播。这样就很容易引起安全性问题,比如我们发送的一些携带关键性数据的广播有可能被其他的应用程序截获,或者其他的应用程序不断的向我们的广播接收器发送各种垃圾广播。所以Android引入了一套广播机制,这个机制发出的广播只能够在应用程序的内部进行传递,也只能接收来自本应用程序发出的广播。本地广播主要使用了LocalBroadcastManager来对广播进行管理。
@Override
protected void onCreate(Bundle savedInstanceState){
.....
LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(this);//获取实例
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("com.example,broadcasttest.LOCAL_BROADCAST");
LocalReceiver localReceiver = new LocalReceiver();
localBroadcastManager.registerReceiver(localReceiver,intentFilter);
.....
}
触发发送广播事件里也需要修改
Intent intent = new Intent("om.example.broadcasttest.LOCAL_BROADCAST);
localBroadcastManager.sendBroadcast(intent);//发送本地广播
取消注册:
localBroadcastManager.unregisterReceiver(localReceiver);
注:本地广播是无法通过静态注册的方式来接收的,必须用动态注册。
最后总结一下本地广播的优点吧。
1.可以明确的知道正在发送的广播不会离开我们的程序,不需要担心机密数据泄露。
2.其他程序无法将广播发送到我们程序的内部,因此不需要担心会有安全漏洞的隐患。
3.发送本地广播比发送全局广播将会更加高效。