Android-有序广播是可以中断的
在之前的博客,Android-广播概念,中介绍了(广播和广播接收者)可以组件与组件之间进行通讯,有两种类型的广播(无序广播 和 有序广播),这篇博客就来讲解有序广播的代码实现:
有序广播:接收者 可以自己设置接受的顺序,所以叫有序广播
有序广播是可以中断的,而指定某个接收者的有序广播是无法中断的
在AndroidManifest.xml订阅 两个接收者
<!--
订阅(Xml形式订阅接收者)
注意:订阅的是接收者,和广播发送没有半毛钱关系
-->
<receiver android:name=".br.MyBroadcastReceiver1"> <intent-filter
android:priority="200"> <!-- 设置优先级别为 200 (最大100 / 最小 -1000) -->
<!-- Action这是必写的 -->
<action android:name="my.MyBroadcastReceiver.custom.action" /> <!-- 这个可有可无,一旦加了,发送者也必须要设置 -->
<data android:scheme="OOO" /> <!-- 注意:这里不能加 : --> </intent-filter> </receiver> <!--
订阅(Xml形式订阅接收者)
注意:订阅的是接收者,和广播发送没有半毛钱关系
-->
<receiver android:name=".br.MyBroadcastReceiver2"> <intent-filter
android:priority="600"> <!-- 设置优先级别为 600 (最大100 / 最小 -1000) -->
<!-- Action这是必写的 -->
<action android:name="my.MyBroadcastReceiver.custom.action" /> <!-- 这个可有可无,一旦加了,发送者也必须要设置 -->
<data android:scheme="OOO" /> <!-- 注意:这里不能加 : --> </intent-filter> </receiver>
定义 MyBroadcastReceiver1 接收者
package liudeli.croadcast1.br; import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log; /**
* 定义 接收者
*/
public class MyBroadcastReceiver1 extends BroadcastReceiver { private final String TAG = "MyBroadcastReceiver"; /**
* 接收的方法
* @param context 传递过来的上下文
* @param intent 传递过来的意图,可以获取很多信息
*/
@Override
public void onReceive(Context context, Intent intent) {
Log.d(TAG, "【1111111111】intent.getAction():" + intent.getAction());
Log.d(TAG, "【1111111111】intent.getDataString():" + intent.getDataString()); // 真实开发中是这样写的
if ("my.MyBroadcastReceiver.custom.action2".equals(intent.getAction())) {
String data = intent.getDataString();
String[] dataArray = data.split(":");
Log.d(TAG, "【1111111111】data:" + dataArray[1]);
Log.d(TAG, "【1111111111】music:" + intent.getStringExtra("music"));
} else if ("xxx.action".equals(intent.getAction())) {
// 做相应的业务逻辑处理
// ...
} else if ("xxx.action".equals(intent.getAction())) {
// 做相应的业务逻辑处理
// ...
}
}
}
定义 MyBroadcastReceiver2 接收者
package liudeli.croadcast1.br; import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log; /**
* 定义 接收者
*/
public class MyBroadcastReceiver2 extends BroadcastReceiver { private final String TAG = "MyBroadcastReceiver"; /**
* 接收的方法
* @param context 传递过来的上下文
* @param intent 传递过来的意图,可以获取很多信息
*/
@Override
public void onReceive(Context context, Intent intent) {
Log.d(TAG, "【222222222】intent.getAction():" + intent.getAction());
Log.d(TAG, "【222222222】intent.getDataString():" + intent.getDataString()); // 真实开发中是这样写的
if ("my.MyBroadcastReceiver.custom.action2".equals(intent.getAction())) {
String data = intent.getDataString();
String[] dataArray = data.split(":");
Log.d(TAG, "【222222222】data:" + dataArray[1]);
Log.d(TAG, "【222222222】music:" + intent.getStringExtra("music"));
} else if ("xxx.action".equals(intent.getAction())) {
// 做相应的业务逻辑处理
// ...
} else if ("xxx.action".equals(intent.getAction())) {
// 做相应的业务逻辑处理
// ...
}
}
}
发送有序广播send:
/**
* 发送有序广播
*/
public void sendOrderBroadcast(View view) {
/**
* 两个接收者在AndroidManifest.xml是这样订阅的:怎么订阅,就怎么发送
* <intent-filter>
* <!-- Action这是必写的 -->
* <action android:name="my.MyBroadcastReceiver.custom.action" />
*
* <!-- 这个可有可无,一旦加了,发送者也必须要设置 -->
* <data android:scheme="OOO" /> <!-- 注意:这里不能加 : -->
* </intent-filter>
*/
Intent intent = new Intent();
intent.setAction("my.MyBroadcastReceiver.custom.action");
intent.setData(Uri.parse("OOO:四环奥迪,五环奥运")); // 注意:要加 :
intent.putExtra("music", "奥林匹克风歌曲"); // 而外携带值 // 参数一:意图 参数二:谁能接收我的广播(自定义权限)
sendOrderedBroadcast(intent, null);
}
没在 MyBroadcastReceiver2 加入中断的日志
12-17 08:49:52.885 4872-4872/liudeli.croadcast1 D/MyBroadcastReceiver: 【222222222】intent.getAction():my.MyBroadcastReceiver.custom.action
12-17 08:49:52.885 4872-4872/liudeli.croadcast1 D/MyBroadcastReceiver: 【222222222】intent.getDataString():OOO:四环奥迪,五环奥运
12-17 08:49:52.887 4872-4872/liudeli.croadcast1 D/MyBroadcastReceiver: 【1111111111】intent.getAction():my.MyBroadcastReceiver.custom.action
12-17 08:49:52.887 4872-4872/liudeli.croadcast1 D/MyBroadcastReceiver: 【1111111111】intent.getDataString():OOO:四环奥迪,五环奥运
由于MyBroadcastReceiver2 接收者,优先接受到信息,所以在 MyBroadcastReceiver2中断广播,abortBroadcast();
package liudeli.croadcast1.br; import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log; /**
* 定义 接收者
*/
public class MyBroadcastReceiver2 extends BroadcastReceiver { private final String TAG = "MyBroadcastReceiver"; /**
* 接收的方法
* @param context 传递过来的上下文
* @param intent 传递过来的意图,可以获取很多信息
*/
@Override
public void onReceive(Context context, Intent intent) { /**
* 中断广播
*/
abortBroadcast(); Log.d(TAG, "【222222222】intent.getAction():" + intent.getAction());
Log.d(TAG, "【222222222】intent.getDataString():" + intent.getDataString()); // 真实开发中是这样写的
if ("my.MyBroadcastReceiver.custom.action2".equals(intent.getAction())) {
String data = intent.getDataString();
String[] dataArray = data.split(":");
Log.d(TAG, "【222222222】data:" + dataArray[1]);
Log.d(TAG, "【222222222】music:" + intent.getStringExtra("music"));
} else if ("xxx.action".equals(intent.getAction())) {
// 做相应的业务逻辑处理
// ...
} else if ("xxx.action".equals(intent.getAction())) {
// 做相应的业务逻辑处理
// ...
}
}
}
在 MyBroadcastReceiver2 加入中断的日志
12-17 08:56:36.008 5070-5070/liudeli.croadcast1 D/MyBroadcastReceiver: 【222222222】intent.getAction():my.MyBroadcastReceiver.custom.action
12-17 08:56:36.008 5070-5070/liudeli.croadcast1 D/MyBroadcastReceiver: 【222222222】intent.getDataString():OOO:四环奥迪,五环奥运
Android-有序广播是可以中断的的更多相关文章
- Android的有序广播和无序广播(解决安卓8.0版本之后有序广播的接收问题)
前言 Google从Android8.0版本开始,对在清单文件中静态注册广播做了限制. *** 特殊广播(动态注册广播接收者) 说:有序广播和无序广播之前,咱们先来说下Android中一些特殊的广播如 ...
- Android学习笔记(十二)BroadcastReceiver的有序广播和优先级
前两篇博文中简单整理了普通广播,其实还有有序广播,有序广播在开发中也是比不可少的,可以给广播接收者设定优先级来控制接受顺序,并却可以中断广播传递等等. 一.两种Broadcast: · 普通广播(No ...
- Android(java)学习笔记179:BroadcastReceiver之 有序广播和无序广播(BroadcastReceiver优先级)
之前我们在Android(java)学习笔记178中自定义的广播是无序广播,下面我们要了解一下有序广播: 1. 我们首先了解一下有序广播和无序广播区别和联系? (1) 有序广播> 接受者 ...
- android 51 有序广播
无序广播:一条广播发送出去,多个接收者接收没有顺序.有序广播:广播接收者可以设置优先级,优先级高的先收到广播.有序广播可以设置优先级. mainActivity.java package com.sx ...
- Android BroadcastReceiver实例Demo(有序广播的发送)
上一篇简介了广播的发送,这篇主要介绍下,有序广播的发送. 设置完相关属性的时候,广播就会依照有序的方式进行发送: 发送顺序: 先发送第二条广播: 再发送第一条广播: 最后发送第三条广播. 代码例如以下 ...
- 有序广播和标准广播 --Android开发
一.标准广播和有序广播也很容易理解的. 标准广播: (1)通过sendBroadcast()方法发送 (2)通过异步方式发送,广播接收者的执行顺序是不明确的 有序广播: (1)通过sendOrderB ...
- Android(java)学习笔记122:BroadcastReceiver之 有序广播和无序广播(BroadcastReceiver优先级)
之前我们在Android(java)学习笔记178中自定义的广播是无序广播,下面我们要了解一下有序广播: 1. 我们首先了解一下有序广播和无序广播区别和联系? (1)有序广播> 接受者有优先级, ...
- Android BroadcastReceiver 发送有序广播
普通广播(Normal Broadcast): 一,优缺点:和有序广播的优缺点相反! 二,发送广播的方法:sendBroadcast() 有序广播(Ordered Broadcast): 一,优缺点 ...
- Android菜鸟的成长笔记(26)——普通广播与有序广播
BroadcastReceiver是Android系统的四大组件之一,BroadcastReceiver是一个全局的系统级监听器,它拥有自己的独立进程. 我们来写一个最简单的广播接收过程 先在mani ...
随机推荐
- java课程设计-坦克大战
团队课程设计博客链接 个人负责模块 枚举类.工具类.子弹类.图片素材的查找,地图制作 Git管理 包名类名的命名 详细说明 枚举类 如 单人和双人模式 工具类 将每个图片的路径使用字符串保存,便于调用 ...
- umount时目标忙解决办法
标签(空格分隔): ceph ceph运维 osd 在删除osd后umount时,始终无法umonut,可以通过fuser查看设备被哪个进程占用,之后杀死进程,就可以顺利umount了. [root@ ...
- Microsoft SQL Server on Linux破解 2G内存限制
首先,贴上微软官方安装方法,大家按照官方的操作就行. 微软官方安装方法 相信很多同学遇到一个问题就是: sqlservr: This program requires a machine with a ...
- 在Windows命令行窗口中输入并运行PHP代码片段(不需要php文件)的方法
有时候只是简单的为了测试某个php函数的效果,以前总是需要建一个php文件,复制这个文件的路径,再通过web访问或者用php命令执行这个php文件. 一直想要怎么才能不用创建文件,才能直接执行PHP代 ...
- 将jar包安装到maven仓库
<!-- https://mvnrepository.com/artifact/ojdbc/ojdbc --><!-- (参数一):下载到本地的ojdbc-10.2.0.4.0.ja ...
- windows下测试flask的例子tuorial报错flask KeyError: 'DATABASE'
windows下测试flask的例子tuorial报错flask KeyError: 'DATABASE' flask KeyError: 'DATABASE' 提示是 变量 database错误 由 ...
- 学python着几个要搞清楚WSGI和uWSGI区别
1 WSGI是一种通信协议 2 uwsgi是一种线路协议而不是通信协议,在此常用于在uWSGI服务器与其他网络服务器的数据通信. 3 而uWSGI是实现了uwsgi和WSGI两种协议的Web服务器.
- IOS上架(九) AppStore编译生成ipa文件并上传
IOS上架上传ipa文件 AppStore https://itunesconnect.apple.com delphi project>option里的CFBundleVersion 上传的版 ...
- C#抽象类与接口的区别【转】
一.抽象类: 抽象类是特殊的类,只是不能被实例化(可以用派生类实例化基类对象):除此以外,具有类的其他特性:重要的是抽象类可以包括抽象方法(当然它可以有普通方法),这是普通类所不能的.抽象方 ...
- 在coursera上有哪些值得推荐的课程
来自知乎 https://www.zhihu.com/question/22436320/answer/224996328