Android 四大组件学习之BroadcastReceiver三
本节学习广播的分类。
广播分为无序广播和有序广播
无序广播:
广播发送者的action与广播接收者的action都匹配的话,所以广播介绍者都能够收到这条广播,而且没有先后顺序,能够觉得是同一时候收到
有序广播:
广播发送者的action与广播接收者的action都匹配的话,所以广播介绍者都能够收到这条广播,可是有先后顺序,高优先级的先收到
既然知道什么是无序广播和有序广播后, 那我们举例说明:
那我们模拟生活中一个样例说明。 某高校正在举行体操比赛。
这时候我们伟大的计算机学院就开会了。
院长将几个班级的导员开会完,导员又组织各个班的班长开会,最后各个班级的班长给大家传达会议精神。
我们如果: 某某某高校校长是这次广播的发送者。计算机学院的院长。导员和各个班的班长是广播接收者
先用无序广播举例:
第一: 创建校长应用程序。也就是广播的发送者:
public class PresidentActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void sendBroadcast(View v)
{
Intent intent = new Intent();
intent.setAction("com.demo.SPORT_MEET_SPIRIT");
intent.putExtra("SPORT_MEET", "每一个学生早上7点必须上早操");
sendBroadcast(intent);
}
}
第二: 创建计算机学校院长接收者。也就是广播的接收者
public class ComputerPresidentReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
String spirit = intent.getExtras().getString("SPORT_MEET");
Log.i("TeacherReceiver", "校长说: "+spirit);
}
}
第三:创建导员接收者,也就是广播的介绍者
public class TeacherReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String spirit = intent.getExtras().getString("SPORT_MEET");
Log.i("TeacherReceiver", "院长说: "+spirit);
}
}
第三:创建最不听话的计算机同学接收者。也就是广播的接收者:
public class StudentReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
//得到广播的数据
String spirit = intent.getExtras().getString("SPORT_MEET");
//显示
Log.i("StudentReceiver", "导员说: "+spirit);
}
}
此时清单文件里配置为:
<receiver android:name="com.demo.broadcastreceiveractivity.ComputerPresidentReceiver">
<intent-filter >
<action android:name="com.demo.SPORT_MEET_SPIRIT"></action>
</intent-filter>
</receiver>
<receiver android:name="com.demo.broadcastreceiveractivity.TeacherReceiver">
<intent-filter >
<action android:name="com.demo.SPORT_MEET_SPIRIT"></action>
</intent-filter>
</receiver>
<receiver android:name="com.demo.broadcastreceiveractivity.StudentReceiver">
<intent-filter >
<action android:name="com.demo.SPORT_MEET_SPIRIT"></action>
</intent-filter>
</receiver>
ok。当我们校长发送广播后:看看现象:
能够看到先是校长说。然后院长说,再然后是导员说。
看起来好像挺有顺序的。可是我将配置文件的顺序改为:
<receiver android:name="com.demo.broadcastreceiveractivity.StudentReceiver">
<intent-filter >
<action android:name="com.demo.SPORT_MEET_SPIRIT"></action>
</intent-filter>
</receiver>
<receiver android:name="com.demo.broadcastreceiveractivity.TeacherReceiver">
<intent-filter >
<action android:name="com.demo.SPORT_MEET_SPIRIT"></action>
</intent-filter>
</receiver>
<receiver android:name="com.demo.broadcastreceiveractivity.ComputerPresidentReceiver">
<intent-filter >
<action android:name="com.demo.SPORT_MEET_SPIRIT"></action>
</intent-filter>
</receiver>
学生放在最前面注冊,则结果为:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
这时候顺序明显不正确了。 这就是无序广播的特点。对于接受没有先后顺序。这明显和实际不符合。要想做到符合就必须用有序广播
举例有序广播:
首先: 给每一个广播接受者设置权限,权限是-1000到1000。当中1000的优先级最高
<receiver android:name="com.demo.broadcastreceiveractivity.StudentReceiver">
<intent-filter android:priority="500">
<action android:name="com.demo.SPORT_MEET_SPIRIT"></action>
</intent-filter>
</receiver>
<receiver android:name="com.demo.broadcastreceiveractivity.TeacherReceiver">
<intent-filter android:priority="800">
<action android:name="com.demo.SPORT_MEET_SPIRIT"></action>
</intent-filter>
</receiver>
<receiver android:name="com.demo.broadcastreceiveractivity.ComputerPresidentReceiver">
<intent-filter android:priority="1000">
<action android:name="com.demo.SPORT_MEET_SPIRIT"></action>
</intent-filter>
</receiver>
其次: 发送广播的方式就的改变:
public void sendBroadcast(View v)
{
Intent intent = new Intent();
intent.setAction("com.demo.SPORT_MEET_SPIRIT");
//intent.putExtra("SPORT_MEET", "每一个学生早上7点必须上早操"); //发送的广播为无序广播
//sendBroadcast(intent); //发送有序广播
sendOrderedBroadcast(intent, null, null, null, 0, "每一个学生早上7点必须上早操", null);
}
然后。就每一个接收者做个调整:
计算机院长把校长的话给改了,校长说计算机要当第一必须6点半起来:
public class ComputerPresidentReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
//假设发送的时候数据是通过intent发送的,就通过intent取得
//String spirit = intent.getExtras().getString("SPORT_MEET");
//假设不是。就是简单的字符串的话,能够通过getResultData得到
String spirit = getResultData();
Log.i("ComputerPresidentReceiver", "校长说: "+spirit);
setResultData("每一个学生早上6点半必须上早操");
}
}
这时候广播到导员了。导员说计算机系必须当第一。6点起来:
public class TeacherReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
//String spirit = intent.getExtras().getString("SPORT_MEET");
String spirit = getResultData();
Log.i("TeacherReceiver", "院长说: "+spirit);
setResultData("每一个学生早上6点必须上早操");
}
}
这时候班长传达旨意来了:
public class StudentReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
//得到广播的数据
//String spirit = intent.getExtras().getString("SPORT_MEET");
//显示
String spirit = getResultData();
Log.i("StudentReceiver", "导员说: "+spirit);
setResultData("谁爱上谁上去,反正我不去!");
}
}
这时候同学们就说: 谁爱上谁上去,反正我不去!
看一下执行效果:
这样校长的旨意就传达了。可是同学们究竟该怎么办呢? 有一天学校的检查部门(也就是一帮臭b学生会,来检查上早操的人数)
这时候我们就须要对发送者在改造:
public void sendBroadcast(View v)
{
Intent intent = new Intent();
intent.setAction("com.demo.SPORT_MEET_SPIRIT");
//intent.putExtra("SPORT_MEET", "每一个学生早上7点必须上早操"); //发送的广播为无序广播
//sendBroadcast(intent); //发送有序广播
sendOrderedBroadcast(intent, null, new resultReceiver(), null, 0, "每一个学生早上7点必须上早操", null);
} //广播的终于接受者
class resultReceiver extends BroadcastReceiver
{ @Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
String spirit = getResultData();
Log.i("resultReceiver", "计算机上早情况:" + spirit);
} }
演示效果为:
学生会一看,计算机系8点了还没人上早操,就几个胆小的去上了。
这就是有序广播,发送者发送后,第一个接受者能够对广播的内容改动,同一时候也能够终止广播的继续发送。
可是广播的终于接受者是一定能够收到此广播的。
比方: 有一天导员比較忙,忘记了传达会议的精神
public class TeacherReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
//String spirit = intent.getExtras().getString("SPORT_MEET");
String spirit = getResultData();
Log.i("TeacherReceiver", "院长说: "+spirit);
//因为太忙,忘了,也就不传播会议精神了
abortBroadcast();
//setResultData("每一个学生早上6点必须上早操");
}
}
结果为:
导员没有给班长传达会议精神,同学们也没收到, 当然也没人去上早操。可是学生会还是会说到终于的广播消息的。
注意: 假设你发送的是无序广播的话,使用abortBroadcast();是无法终止广播的传送的,对无序广播是没实用的。
相同setResultData也是对无序广播没实用的。
这个大家能够试试。
Android 四大组件学习之BroadcastReceiver三的更多相关文章
- Android 四大组件学习之BroadcastReceiver一
本节课学习四大组件最后一个, 广播接受者. 顾名思义广播接受者就是接受广播呗.比方在现实社会中,曾经每一个人家都有一台收音机,这可就能够去接受广播发出来的消息.大家都知道.程序世界也是參照的显示生活设 ...
- Android 四大组件学习之BroadcastReceiver二
上节学习了怎样创建一个广播.也尝试接受系统打电话的广播. 本节课学习怎样自己定义广播.自己定义广播实质上也就是创建一个发送广播者,创建一个接受该广播者. 那我们就開始行动吧. 先创建一个发送广播的应用 ...
- Android 四大组件学习之BroadcastReceiver四
本节学习系统中特殊的广播接收者. 我们前面几节不是说了,当广播接受者一旦注冊到系统中,当系统发送的广播和你注冊的广播的action匹配时,系统就会启动广播接收者所在的进程.除非用户手动停止广播接收者所 ...
- Android 四大组件学习之ContentProvider三
上节课学习怎样自己创建一个ContentProvider.以及用ContentResolver去操作ContentProvider. 今天我们用系统提供的ContentProvider. 先来个简单的 ...
- android四大组件学习总结以及各个组件示例(1)
android四大组件分别为activity.service.content provider.broadcast receiver. 一.android四大组件详解 1.activity (1)一个 ...
- Android 四大组件学习之Server一
上次学习了Android四大组件Activity之后,我们深刻理解了Activity.这次我们学习四大组件Service. Service与Activity的级别是一样的,都是Android系统不可缺 ...
- Android四大组件之一:BroadCastReceiver(广播接收者)
广播接受者是(BroadCastReceiver)是Android中的地大组件之一,之前学习了一些关于BroadCastReceiver方面的知识,今天回过头来发现已经快忘记的差不多了,毕竟现在是刚开 ...
- Android 四大组件学习之ContentProvider二
上节学习了什么是ContentProvider.以及ContentProvider的作用.以及什么是URL.本节就对上节学习的知识做一个实践,也就是定义自己的ContentProvider 好.实践是 ...
- android四大组件学习总结以及各个组件示例(2)
上篇博文讲解了activity.content provider,此篇博文来仔细总结service.broadcast receiver: 3. Service >什么是服务?>windo ...
随机推荐
- 使用邮件和RSS两种方式,订阅博客更新通知
分类: 系统运维 点击订阅按钮,可以订阅本博客的更新 输入您的邮件地址,可以订阅本博客的更新通知,及时了解最新内容 使用RSS,订阅-马二进三名人传记-博客 也许大家是第一次听到RSS这个概念,那什么 ...
- SQLServer存储过程返回值总结
1. 存储过程没有返回值的情况(即存储过程语句中没有return之类的语句) 用方法 int count = ExecuteNonQuery(..)执行存储过程其返回值只有两种情况 (1)假如通 ...
- 用Parallel.For()和Parallel.For<TLocal>()方法实现并行运行迭代
Parallel类是.NET 4中新增的抽象线程类.如果你开发用的是VS2008或更低版本,那么就直接关闭吧,下面两个示例用了匿名委托,如果不知道匿名委托的语法,那么先去简单了解一下,不然很难理解示例 ...
- python性能优化建议
参考: https://segmentfault.com/a/1190000000666603 http://blog.csdn.net/zhoudaxia/article/details/23853 ...
- 32.NET中加密解密基本概念
对消息的接收方来说,安全的交流方式需要同时满足3个条件: 1.完整性:消息在传输途中没有被篡改过,即消息是完好无损的. 2.保密性:接收放可以理解或解密来自发送方的信息.(不保证第三方无法获得,但保证 ...
- iOS 调用短信、电话、邮件、浏览器等
1.调用 自带mail[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"mailto://admin@hzl ...
- 【JVM】调优笔记3-----JVM参数配置 JDK1.8
一.关于JVM参数配置,有多种途径. 1.在tomcat中直接配置的 打开tomcat的安装目录, 在bin下修改catalina.bat文件 添加如下: set "JAVA_OPTS=-X ...
- C++语言笔记系列之十六——赋值兼容规则&多继承的二义性
1.赋值兼容规则 (1)派生类对象能够给基类对象赋值,这样的情况下派生类对象将从基类继承的成员的值赋值给一个基类对象:可是不同意将一个基类的对象赋值给一个派生类. (2)能够将派生类对象的地址赋给基类 ...
- Android图片加载框架最全解析(四),玩转Glide的回调与监听
大家好,今天我们继续学习Glide. 在上一篇文章当中,我带着大家一起深入探究了Glide的缓存机制,我们不光掌握了Glide缓存的使用方法,还通过源码分析对缓存的工作原理进行了了解.虽说上篇文章和本 ...
- [Android Pro] Swift 3.0多线程
本文只介绍Grand Central Dispath(GCD) 中央调度 个人认为一个GCD就够用了,可能是改版或是其他的在找之前写的多线程方法时发现不能用了,看文档之后发现改了,现在看上去更加简单易 ...