文档章节

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

共有 人打赏支持
程序袁_绪龙
粉丝 98
博文 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
故意为之?安卓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
Android学习之Android广播机制

一提起广播,我们首先想到的是收音机,当我们想要收听某个广播台时只需要将收音机的频率调至广播台所在的频率即可!而Android中的广播其实和收音机非常相似,不过它没有所谓的频率,它是由系...

wustrive_2008
2011/07/02
0
2

没有更多内容

加载失败,请刷新页面

加载更多

设计模式之 明确责任 观察者模式 状态模式 责任链模式

观察者模式是任务分发的一种模式。 如果认为我们设计的系统的各个模块(或子系统)的最终目的是完成共同任务,那么这个任务如何分配到多个模块的就是我们遇到的第一个问题。简单设计场合我们...

backbye
23分钟前
2
0
14-利用思维导图梳理JavaSE-大汇总

14-利用思维导图梳理JavaSE-Java基础知识大汇总 主要内容 1.对象入门 2.一切都是对象 3.程序流程控制 4.初始化和消除 5.权限访问控制 6.复用类 7.多态 8.接口与抽象类 9.内部类 10.容器 11.异...

飞鱼说编程
58分钟前
6
0
利用Lombok编写优雅的spring依赖注入代码,去掉繁人的@Autowired

大家平时使用spring依赖注入,都是怎么写的? @Servicepublic class OrderService { @Autowired private UserService userService;} 是不是很熟悉的感觉?但是呢 如果你用...

HeyS1
今天
26
0
IBATIS 写BLOB字段遇到的问题

1、 首先遇到的配置问题,通过设置typeHandler 来支持写入。接下来由此引出了事务的问题。 <typeHandler jdbcType="BLOB" javaType="[B" callback="org.springframework.orm.ibatis.support....

echo-neo
今天
1
0
37. Sudoku Solver

Description tags: backtrack,hash table difficulty: hard Write a program to solve a Sudoku puzzle by filling the empty cells.A sudoku solution must satisfy all of the following......

52iSilence7
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部