文档章节

Android广播机制

程序袁_绪龙
 程序袁_绪龙
发布于 2014/09/26 13:35
字数 1007
阅读 89
收藏 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" />

本文转载自:http://www.cnblogs.com/totem1990/archive/2012/09/10/2679391.html

共有 人打赏支持
程序袁_绪龙
粉丝 101
博文 242
码字总数 66750
作品 0
普陀
程序员
私信 提问
android broadcastReceiver生命周期及两种应用

一:Android 广播的生命周期 一个广播接收者有一个回调方法:void onReceive(Context curContext, Intent broadcastMsg)。当一个广播消息到达接收者时,Android调用它的onReceive()方法并传递...

gavin_jin
2012/02/17
0
4
《Android深入透析》之广播(Broadcast)

概述 在android中,Broadcast作为四大组件之一,被广泛的应用在android程序之间的数据传递。举一个大家都比较熟悉的例子来说明。在车上的时候大家都有收听广播的习惯,广播电台通过发送不同频...

朵朵和糖糖
2014/11/12
0
0
使用广播-BroadcastReceiver最详细解析

女孩:BroadcastReceiver是什么呀? 男孩:Broadcast是广播的意思,在Android中应用程序之间的传输信息的机制,BroadcastReceiver是接收广播通知的组件,广播和广播接收器是Android中需要了解...

达叔小生
07/31
0
0
故意为之?安卓9.0以前的全部系统版本均受到“API-breaking”漏洞的影响

        Nightwatch Cybersecurity于8月29日发布消息称,发现Android新漏洞,它使恶意应用程序得以绕过权限检查和现有的防护,访问系统广播信息。根据该通报,这一漏洞的信息如下:  ...

嘶吼RoarTalk
09/07
0
0
Android引入广播机制的用意。单线程模型Message、Handler、Message Que.

注册广播有几种方式,这些方式有何优缺点?请谈谈Android引入广播机制的用意。 Android 的广播机制 在 Android 里面有各种各样的广播,比如电池的使用状态,电话的接收和短信的接收都会产生一...

一别经年
2014/03/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Integer使用双等号比较会发生什么

话不多说,根据以下程序运行,打印的结果为什么不同? Integer a = 100;Integer b = 100;System.out.println(a == b);//print : trueInteger a = 200;Integer b = 200;System.out.pr...

兜兜毛毛
28分钟前
1
0
CockroachDB

百度云上的CockroachDB 云数据库 帮助文档 > 产品文档 > CockroachDB 云数据库 > 产品描述 开源NewSQL – CockroachDB在百度内部的应用与实践 嘉宾演讲视频及PPT回顾:http://suo.im/5bnORh ...

miaojiangmin
40分钟前
2
0
I2C EEPROM驱动实例分析

上篇分析了Linux Kernel中的I2C驱动框架,本篇举一个具体的I2C设备驱动(eeprom)来对I2C设备驱动有个实际的认识。 s3c24xx系列集成了一个基于I2C的eeprom设备at24cxx系列。at24cxx系列芯片包...

yepanl
41分钟前
3
0
设计模式之工厂模式

本篇博文主要翻译这篇文章: https://www.journaldev.com/1392/factory-design-pattern-in-java 由于翻译水平有限,自认为许多地方翻译不恰当,欢迎各位给出宝贵的建议,建议大家去阅读原文。...

firepation
今天
8
0

中国龙-扬科
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部