《第一行代码--Android》读书笔记之广播机制
2015-11-19 17:35
393 查看
广播的类型
标准广播(Normal Broadcasts)是完全异步执行的广播,在广播发出后,几乎所有的广播接受器都同一时间接收到这条广播消息,放射性传播的消息。有序广播(Ordered Broadcasts)是同步执行的广播,在广播发出后,只有一个广播***接收到这条广播消息,它在处理完消息后可以选择继续串型传播这条消息,也可以选择截断这条消息的传播。
接受系统广播
要接收广播,首先当然要创建广播***啦!动态注册广播***
自定义一个继承自BroadcastReceiver的类并重写其中的onReceive()方法,写处理接收到的广播的具体逻辑。
创建该自定义广播***的实例。
创建一个intentFilter实例,调用addAction()方法配置具体要接收什么广播消息。
调用registerReceiver()方法关联intentFilter和自定义广播***,完成注册
在onDestroy()方法调用unRegisterReceiver()解除注册。
静态注册广播***
自定义一个继承自BroadcastReceiver的类并重写其中的onReceive()方法,写处理接收到的广播的具体逻辑。
在AndroidManifest的XML文件中注册广播***。
[code]<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的手才行。
[code]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机制详解 /article/1875886.html
相关文章推荐
- android代码混淆后gson无法解析问题
- Android手机安装busybox
- android使用setTheme的方式实现主题切换
- Android数据库查询效率进阶篇
- Android如何捕获手机回退键(BACK)实现程序退出?
- Android Support 包里究竟有什么
- Android开发艺术探索学习-IPC之Binder(二)
- 比较强大 优秀的开源框架 :Android图片加载与缓存:Android Glide 的用法
- android canvas画图
- Android中Handler详解,线程间通信机制
- Gradle打包android 项目
- Android点住按钮同时再点击按钮外的效果
- 活动生命周期
- android拍照和本地选择图片
- Android各个support library特征和区别(官方文档)
- Google Nexus5关于Android 6.0源码的同步,编译和烧写
- android zxing二维码横屏改竖屏
- Android 输入系统之InputDispatcher篇
- Shape Drawable解析
- android layout_weight 用法