Android 广播机制

来源:互联网 发布:ae软件中文版免费下载 编辑:程序博客网 时间:2024/06/05 18:21

首先问一下什么叫广播?

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

 

Android广播的分类:

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

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

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

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

 

处理器的注册:

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

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

 

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

① 自定义处理器类: 

public class MyBroadcastReceiver4extends 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" />点击打开链接

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 用辣椒辣到眼睛怎么办 辣椒辣到眼皮了怎么办 眼被辣椒辣了怎么办 老公欠银行的钱怎么办 离婚老公欠的钱怎么办 欠了几十万债怎么办 执行死刑时已怀孕怎么办 执行死刑世已经怀孕怎么办 孩子被爸爸打该怎么办 二年级的孩子逃课怎么办 龙妈和雪诺怎么办 车本扣6分怎么办 超速50扣了12分怎么办 开车超速扣12分怎么办 超速一次记12分怎么办? 驾照超速扣12分怎么办 c牌一次扣12分怎么办 超速罚500扣12分怎么办 高速超速记3分怎么办 高速超速记12分怎么办 过江隧道关闭了怎么办 高速限速60超了怎么办 超速扣了12分怎么办 上海 12分扣完了怎么办 狗抓伤只淌白沫怎么办 刑事案件法院迟迟不判决怎么办 法院判决书下来了没钱赔偿怎么办 被起诉开庭不去怎么办 地道塌陷造成房屋倒塌怎么办 海外看不了b站怎么办 最近脸胖了好多怎么办 最近胖了好多怎么办啊? 很瘦的人手胖怎么办 长得丑不敢相亲怎么办 abs抱死发不动了怎么办 qq飞车手游车到期了改装怎么办 育碧下载游戏慢怎么办 豹纹守宫鼻子还有个残皮怎么办 睫角守宫断尾怎么办 定金发票弄丢了怎么办 xp电脑显示输入不支持怎么办