文档章节

Android广播机制

程序袁_绪龙
 程序袁_绪龙
发布于 2014/09/26 13:35
字数 1007
阅读 104
收藏 1

「深度学习福利」大神带你进阶工程师,立即查看>>>

首先问一下什么叫广播?

其实在学习android广播机制之前我一直以为广播就是类似于计算机网络里面的广播。如果这么想就打错特错了,Android广播机制指的是,在一个应用程序运行的时候可以自定义一个消息类型,让相应的接收器去处理这个消息或者是系统消息,比如来电话了、来短信了、手机没电了等等系统发送的消息。系统发送的消息也可以通过广播的方式通知给应用程序,这样子就避免了新开一个Thread去监听系统或其他应用发送过来的消息的状态。

Android广播的分类:

1、 普通广播:这种广播可以依次传递给各个处理器去处理

2、 有序广播:这种广播在处理器端的处理顺序是按照处理器的不同优先级来区分的,高优先级的处理器会优先截获这个消息,并且可以将这个消息删除

3、 粘性消息:粘性消息在发送后就一直存在于系统的消息容器里面,等待对应的处理器去处理,如果暂时没有处理器处理这个消息则一直在消息容器里面处于等待状态。

注意:普通广播和粘性消息不同被截获,而有序广播是可以被截获的

处理器的注册:

1、 在代码中用函数代码动态的方式注册。动态注册的处理器必须用代码动态的销毁,每次用来处理消息的就一个实例对象

2、 在配置文件里面静态注册,静态注册有个特点,那就是一旦注册就会一直存在于系统里面,无论应用是否关闭或开关机。(简直就是一个流氓软件病毒啊~)。静态注册每次有处理消息就由系统new一个处理器处理,并销毁

下面具体看看Android广播消息的发送、注册、处理过程:

① 自定义处理器类:

?

public class MyBroadcastReceiver4 extends BroadcastReceiver {
public MyBroadcastReceiver4() {
System.out.println( "创建了一个由registerReceiver()注册的广播接收器" );
}
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
System.out.println( "MyBroadcastReceiver4收到了一个" + action + "消息" );
if (isOrderedBroadcast()) {
System.out.println( "这是一个有序广播,已经被拦截了。" );
this .abortBroadcast();
} else {
System.out.println( "这不是一个有序广播" );
}
Bundle bundle = intent.getExtras();
if (bundle != null ) {
System.out.println( "该消息携带的数据如下:" );
// 获得bundle的一个key的集合
Set set = bundle.keySet();
// 获得上述集合的迭代器
Iterator iterator = set.iterator();
// 用迭代器遍历集合
while (iterator.hasNext()) {
// 取得集合中的一个内容
String str = (String) iterator.next();
// 取得Bundle中的内容
System.out.println(str + "--->" + bundle.get(str));
}
} else {
System.out.println( "该消息没有携带数据" );
}
Toast toast = Toast.makeText(context, "MyBroadcastReceiver4收到了一个"
+ action + "消息" , Toast.LENGTH_LONG);
toast.show();
//将这个消息截获(从消息容器移除)这样其他处理器就没法接收到这个消息
this .abortBroadcast();
}
}

② 发送广播消息

⑴、 发送普通广播:

// 发送一个普通消息

Intent intent = new Intent(); intent.setAction("asdfasdf");

Android_09_10Activity.this.sendBroadcast(intent);

⑵、 发送有序广播:

// 发送一个有序消息

Intent intent = new Intent();

intent.setAction("asdfasdf"); Android_09_10Activity.this.sendOrderedBroadcast(intent,

null);

⑶、 发送粘性广播:

// 发送一个粘性消息

Intent intent = new Intent();

intent.setAction("qwerqwer"); Android_09_10Activity.this.sendStickyBroadcast(intent);

③ 注册广播接收器

⑴动态注册:

// 注册一个广播接收器

IntentFilter intentFilter = new IntentFilter("asdfasdf");

intentFilter.setPriority(0);

Android_09_10Activity.this.registerReceiver(mbr2,

intentFilter);

⑵静态注册:

?

<receiver android:name= ".MyBroadcastReceiver4" >
<intent-filter android:priority= "1000" >
<action android:name= "android.intent.action.WALLPAPER_CHANGED" />
<action android:name= "android.provider.Telephony.SMS_RECEIVED" />
<action android:name= "android.intent.action.PHONE_STATE" />
<action android:name= "android.intent.action.PACKAGE_REMOVED" />
//这一句比较特殊,是上面那个广播消息特有的
<data android:scheme= "package" />
<category android:name= "android.intent.category.DEFAULT" />
</intent-filter>
</receiver>

想发送粘性消息的时候必须在配置文件里面获取权限:

<uses-permission android:name="android.permission.BROADCAST_STICKY" />

想用自定义处理器对系统广播进行处理的话也必须在注册文件里面申明获取权限,比如:

<uses-permission android:name="android.permission.RECEIVE_SMS" />

<uses-permission android:name="android.permission.READ_PHONE_STATE" />

程序袁_绪龙
粉丝 106
博文 242
码字总数 66750
作品 0
普陀
程序员
私信 提问
加载中
请先登录后再评论。
浅入浅出Android(003):使用TextView类构造文本控件

基础: TextView是无法供编辑的。 当我们新建一个项目MyTextView时候,默认的布局(/res/layout/activity_main.xml)中已经有了一个TextView: <TextView 运行效果如下: 修改其文本内容...

樂天
2014/03/22
696
1
程序猿媛一:Android滑动翻页+区域点击事件

滑动翻页+区域点击事件 ViewPager+GrideView 声明:博文为原创,文章内容为,效果展示,思路阐述,及代码片段。文尾附注源码获取途径。 转载请保留原文出处“http://my.oschina.net/gluoyer...

花佟林雨月
2013/11/09
4.3K
1
基于 ThinkPHP 的内容管理系统--歪酷CMS

歪酷网站管理系统(歪酷CMS)是一款基于THINKPHP框架开发的PHP+MYSQL网站建站程序,本程序实现了文章和栏目的批量动态管理,支持栏目无限分类,实现多管理员管理,程序辅助功能也基本实现了常见的文...

鲁大在线
2013/02/19
7K
2
Android3D应用与游戏开发框架--JQGL

JQGL 是一款针对Android设备上3D应用、游戏的开发框架。 核心功能是OpenGL-ES的使用框架,相对于大部分开发者而已,OpenGL是陌生的,没有专门研究无法进行相关的开发。 本框架针对于Android...

Jping
2013/02/21
1.6K
0
硬实时操作系统--Raw OS

Raw-OS 起飞于2012年,Raw-OS志在制作中国人自己的最优秀硬实时操作系统。 Raw-OS 操作系统特性 内核最大关中断时间无限接近0us, s3c2440系统最大关中断时间实测0.8us。 支持idle任务级别的事...

jorya_txj
2013/03/19
6.3K
1

没有更多内容

加载失败,请刷新页面

加载更多

汇总一下 Intellij IDEA 常用的牛逼插件!

来源:blog.csdn.net/sunny243788557/java/article/details/106011723 1、日晒主题 Solarized Themes 2、idea上 类调用时序图 SequenceDiagram for IntelliJ IDEA 3、彩色括号 Rainbow Brac......

路人甲Java
昨天
4
0
StringBuider 在什么条件下、如何使用效率更高?

点击上方“方志朋”,选择“设为星标” 回复”666“获取新整理的面试文章 作者:后青春期的Keats cnblogs.com/keatsCoder/p/13212289.html 引言 都说 StringBuilder 在处理字符串拼接上效率要...

方志朋
昨天
0
0
预告|悬镜子芽:新一代灰盒安全测试技术实践分享

点击蓝字 关注我们 万物皆有法,方能有序运行。网络安全进化到内生安全时代,以框架为起点,规划全景,技术内生外长,不断叠加,形成新一代网络安全之道。2020北京网络安全大会(BCS2020)已...

悬镜
昨天
0
0
zoom免费用户无法在中国登陆,RHUB免费续航zoom

中美关系日趋紧张,许多产品强制要求用户站队,zoom已经做了选择,抛弃众多信任、认可zoom产品的用户。微软选择坚持为中国用户提供服务,谁又说得来明天会如何?我们如此泱泱大国,竟要受制于...

osc_gt7nq50v
9分钟前
10
0
kubernetes 安装笔记

ssh -p 9000 root@127.0.0.1 192.168.56.101 master-node 192.168.56.102 work-node1 192.168.56.103 work-node2 由于kubeadm 默认从官网k8s.grc.io下载所需镜像,国内无法访问,因此需要通过......

solate
9分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部