您的位置:首页 > 编程语言

第一行代码 读笔⑤ (Broadcast)

2016-04-12 21:56 239 查看
全局大喇叭,详解广播机制

广播(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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  broadcast