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

原创 2015年11月19日 17:35:46

广播的类型

  • 标准广播(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

版权声明:本文为博主原创文章,未经博主允许不得转载。

PRML读书笔记-我对机器学习的认识

最近有时间把Christopher M Bishop的《Pattern Recognition and Machine Learning》(PRML)温习了一遍,这本书可以说是机器学习的经典学习之作。...
  • Richard_More
  • Richard_More
  • 2016年10月08日 19:42
  • 2679

【CSAPP】《深入理解计算机系统》读书笔记

这本书在CMU作为计算机系统的入门书籍,每章还对应有课后实验,花了1个多月看完这本书,并且挑选了4个感兴趣的实验完成,收获还是不错的。看完这本书最大的感受就是对整个计算机系统有了一个整体的认识,一个简...
  • a2888409
  • a2888409
  • 2015年08月05日 11:49
  • 1753

Android广播机制实现源码浅析(三)

http://blog.csdn.net/hehui1860/article/details/30727537 在上篇的分析的最后,我们留下了两个问题,一个是静态广播以及有序广播的处理过程,...
  • thinkinwm
  • thinkinwm
  • 2015年04月18日 13:35
  • 2156

《第一行代码--Android》读书笔记之网络编程

浅用WebView 简单配置布局 具体代码 public class MainActivity
  • TellH
  • TellH
  • 2015年11月23日 09:52
  • 843

Android第一行代码读书笔记

从这里开始,进入android的专业开发大门。 活动,是android第一个大的组件。 android开发需要涉及到类的继承,所有活动从Activity这个类继承。 接下来是方法的重写或者说覆盖。...
  • androidTang
  • androidTang
  • 2015年10月09日 00:24
  • 448

《第一行代码--Android》读书笔记之多线程与服务

服务(service)是Android中实现程序后台运行的解决方案。服务并不是运行在一个独立的进程中,而是依赖于创建服务所在的应用程序的进程。实际上,服务并不会自动开启线程。 android多线程编程...
  • TellH
  • TellH
  • 2015年11月22日 12:50
  • 801

《第一行代码--Android》读书笔记之日志工具Log与Activity

日志工具Log Activity Activity的创建与注册 在Activity中使用Menu Intent之于活动 创建Activity Intent传递数据的使者 活动的生命周期 活动的启动模式...
  • TellH
  • TellH
  • 2015年11月17日 20:21
  • 1370

《第一行代码--Android》读书笔记之碎片

碎片的基本用法: 碎片(fragment)是能嵌在活动中的UI片段,相当于mini型的Activity,有完整的布局,和生命周期。一个简单的碎片的创建过程: 新建一个碎片布局,比如,fragme...
  • TellH
  • TellH
  • 2015年11月19日 13:12
  • 975

《第一行代码Android》读书笔记

startActivityForResult()对应onActivityResult() back键会销毁Activity,相当于调用了finish()方法,可以重写onBackPressed()...
  • chinben
  • chinben
  • 2014年10月31日 15:23
  • 922

《第一行代码--Android》读书笔记之UI篇

比较难掌握的UI控件ProgressBar XML属性: android:progressBarStyle:默认进度条样式 android:progressBarStyleHorizontal:水...
  • TellH
  • TellH
  • 2015年11月18日 15:06
  • 509
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:《第一行代码--Android》读书笔记之广播机制
举报原因:
原因补充:

(最多只允许输入30个字)