《第一行代码--Android》读书笔记之广播机制

广播的类型

  • 标准广播(Normal Broadcasts)是完全异步执行的广播,在广播发出后,几乎所有的广播接受器都同一时间接收到这条广播消息,放射性传播的消息。
  • 有序广播(Ordered Broadcasts)是同步执行的广播,在广播发出后,只有一个广播接收器接收到这条广播消息,它在处理完消息后可以选择继续串型传播这条消息,也可以选择截断这条消息的传播。

接受系统广播

要接收广播,首先当然要创建广播接收器啦!

  • 动态注册广播接收器
    • 自定义一个继承自BroadcastReceiver的类并重写其中的onReceive()方法,写处理接收到的广播的具体逻辑。
    • 创建该自定义广播接收器的实例。
    • 创建一个intentFilter实例,调用addAction()方法配置具体要接收什么广播消息。
    • 调用registerReceiver()方法关联intentFilter和自定义广播接收器,完成注册
    • 在onDestroy()方法调用unRegisterReceiver()解除注册。
  • 静态注册广播接收器
    • 自定义一个继承自BroadcastReceiver的类并重写其中的onReceive()方法,写处理接收到的广播的具体逻辑。
    • 在AndroidManifest的XML文件中注册广播接收器。
<receiver android:name=".MyBroadcastReceiver">
            <intent-filter>
                <action android:name="com.example.BROADCAST_TEST"/>
            </intent-filter>
        </receiver>

总结:无论哪一种注册方式,注册广播接收器都需要为之配置好intentFilter,添加action属性。

发送自定义广播

介绍自定义广播之前,我们要回顾一下,什么是Intent。intent能在运行过程中连接两个组件component(众所周知,android的四大组件吧)。Android的三个基本组件——Activity,Service和Broadcast Receiver——都是通过Intent机制激活的,不同类型的组件有不同的传递Intent方式。

  • 发送广播,前提肯定要先自定义一个广播接受器啦。
  • 在AndroidManifest.XML文件中注册广播接收器,在< action_filter>内添加一个自定义的action属性,而这个action属性就是自定义广播的“内核”了。
  • new一个Intent,构造函数传入我们自定义的action属性(内核)。如果要发送标准广播就调用sendBroadcast(intent,null),而要发送有序广播就调用sendOrderedBroadcast(intent, null)发送广播。
  • 注意,发送有序广播时,注册的广播接受器还要添加一个android:priority属性,可以在广播接收器的onReceive()中调用abortBroadcast()截断广播的传播。

使用本地广播

为了解决广播的安全性问题,android引入了一套本地广播机制,本地广播只能在应用程序内部进行传播。本地广播无法通过静态注册的方式来接收。
本地广播特殊的地方是它需要一个LoadBroadcastManager来对广播进行管理,如注册广播接收器和发送本地广播都要经由LoadBroadcastManager的手才行。

localBroadcastManager=LocalBroadcastManager.getInstance(this);
        intentFilter=new IntentFilter();
        forceOfflineReceiver=new ForceOfflineReceiver();
        intentFilter.addAction("com.example.broadcasttest.FORCEOFFLINE");
        localBroadcastManager.registerReceiver(forceOfflineReceiver, intentFilter);
        Button forceOffline=(Button)findViewById(R.id.force_offline);
        forceOffline.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=new Intent("com.example.broadcasttest.FORCEOFFLINE");
                localBroadcastManager.sendBroadcast(intent);
                Toast.makeText(MainActivity.this,"click",Toast.LENGTH_SHORT).show();
            }
        });

另外如果要在广播接收器中启动活动,需要给intent加入FLAG_ACTIVITY_NEW_TASK这个标志。
FLAG_ACTIVITY_NEW_TASK: 设置此状态,记住以下原则,首先会查找是否存在和被启动的Activity具有相同的亲和性的任务栈(即taskAffinity,注意同一个应用程序中的activity的亲和性一样),如果有,刚直接把这个栈整体移动到前台,并保持栈中的状态不变,即栈中的activity顺序不变,如果没有,则新建一个栈来存放被启动的activity。

参考资料和文献:
Task与Activity详解 http://blog.csdn.net/mayingcai1987/article/details/6200909
Android Intent.FLAG_NEW_TASK详解,包括其他的标记的一些解释 http://my.oschina.net/AaronCN/blog/407461?fromerr=eCYA1KDe
android Intent机制详解 http://blog.csdn.net/t12x3456/article/details/7688154

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值