全局大喇叭,详解广播机制
广播(Broadcast):一种广泛运用的在应用程序之间传输信息的机制。
传输信息:
- 实现了不同的程序之间的数据传输与共享。当于发送广播的action相同的接受者都能接受该广播。
- 起到了一个通知的作用。如接受Service的通知。
广播分类:
- 标准广播(Normal broadcasts): 完全异步执行的广播。所有广播接收器(Broadcast Receiver)同时收到该广播。效率较高,当无法截断。
- 有序广播(Orderedbroadcasts): 同步执行的广播,各Broadcast Received按序(优先级)接受信息。可截断的广播。
实现广播接受:
- 动态注册:在代码中进行广播的注册。
- 优点:自由的控制注册于注销,较灵活。
- 缺点:由于在代码中注册,因此必须在相应Activity启动才可以接受广播。
1.对于BroadcastReceiver类的继承,对onReceive()方法的重写,其中代码,会在接受到广播时被执行。
PS:广播接受器中不允许开启线程,因此不应再onReceiver()方法中进行耗时操作或者添加过多逻辑,避免因长时间未结束,程序报错。
class LocalReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "received local broadcast",
Toast.LENGTH_SHORT).show();
}
}
2.过滤器(intentFilter)的设置。intentFilter相当于广播中的频率,使用filter.addAction添加行为类型,用来确定接受哪一些广播。
intentFilter = new IntentFilter();
intentFilter.addAction("com.example.broadcasttest.LOCAL_BROADCAST");
3.将广播进行注册,调用regiseterReceiver()将Receiver与IntentFilter的实例传入。
registerReceiver(localReceiver, intentFilter);
PS:在结束使用后,动态广播需要取消注册。在onDestroty()中调用unregisterReceiver()方法。
unregisterReceiver(localReceiver);
静态注册: 可以在程序未启动的情况下,保持广播接受状态。
需要在AndroidManifest .xml中注册,不需程序启动即可接收,可用作自动启动程序。
1.对于Broadcast Receiver的编写,与动态没有区别,对于onReceive()方法的重写。
2.在AndroidManifest .xml中注册。
- 标签,静态广播在其中注册。
- android:name 指定具体的广播器。
- 指定接收的广播
</receiver>
<receiver android:name=".MyBroadcastReceiver">
<intent-filter>
<action android:name="com.example.broadcasttest.MY_BROADCAST"/>
</intent-filter>
</receiver>
如果是对于系统的一些广播监听,如开机广播,需要声明权限。
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
发送标准广播:
通过intent指定发送广播的值,调用Context的sendBroadcast()方法发出广播。
(个人感觉类似于隐式intent的使用,广播发送方都是通过隐式意图,发送给其他程序)
Intent intent = new Intent();
intent.setAction("...");
Context.sendBroadcast(intent);
发送有序广播:
相比于标准广播,有了一个优先度的不同。发送广播只是调用方法的不同,调sendOrderedBroadcast()方法,方法中第二个参数为与权限相关的字符串。
Intent intent = new Intent();
intent.setAction("...");
Context.sendOrderedBroadcast(intent,null);
广播接受的顺序:
在注册时对其进行设置,android:priority=“…”
<application>
<receiver android:name=".Receiver">
<intent-filter android:priority="1000">
<action android:name=".............."/>
</intent-filter>
</receiver>
</application>
广播的拦截:
在onReceive()中,调用abortBroadcast()方法完成拦截。
本地广播的使用:
为了保证安全性问题,防止包含关键性数据的广播被其他程序拦截,或者其他程序不断向本接收器发送垃圾广播,从而有了本地广播机制。
本地广播:使用该机制的发出的广播,只能在本程序内传递,接收器也可能接受本应用的广播。
使用:在于利用
1..创建LocalBroadcastManager:
final LocalBroadcastManager localBroadcastManager=LocalBroadcastManager.getInstance(this);
2.通过LocalBroadcastManager发送广播
Intent intent=new Intent();
intent.setAction(".......................");
localBroadcastManager.sendBroadcast(intent);
3.动态注册广播接收器.(所有能接收该信息的接收器都必须为LocalBroadcastManager的实例)
IntentFilter filter=new IntentFilter();
filter.addAction("..............................");
localBroadcastManager.registerReceiver(new MyBroadCastReceiver(),filter);