第一行代码 读笔⑤ (Broadcast)

全局大喇叭,详解广播机制

广播(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);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值