Android学习总结(六)———— 发送自定义广播
一.两种广播类型
2.1 标准广播
是一种完全异步执行的广播,在广播发出去之后,所有的广播接收器几乎都会在同一时刻接收到这条广播消息,因此它们之间没有任何先后顺序可言。这种广播的效率会比较高,但同时也意味着它是无法截断的。
2.2 有序广播
是一种同步执行的广播,在广播发出之后,同一时刻只会有一个广播接收器能够收到这条广播消息,当这个广播接收器中的逻辑执行完毕后,广播才会继续传递,所有此时的广播接收器是有先后顺序的,优先级高的广播接收器就可以先收到广播消息了,并且前面的广播接收器还可以截断正在传递的广播,这样后面的广播接收器就无法收到广播消息了。
二.示例代码
2.1、发送标准广播
新建一个MyBroadcastReceiver继承自BroadcastReceiver,代码如下所示:
package com.nyl.custombroadcast; import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast; public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"收到广播接收器",Toast.LENGTH_SHORT).show();
}
}
然后AndroidManifest.xml中注册下,写上Intent-filter:
定义一个简单的按钮,用于作为发送广播的触发点,然后在MainActivity中完成发送按钮,代码如下所示:
package com.nyl.custombroadcast; import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button; public class MainActivity extends Activity implements View.OnClickListener { private Button btnSendBroadcast; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnSendBroadcast = (Button) findViewById(R.id.btnSendBroadcast);
btnSendBroadcast.setOnClickListener(this);
} @Override
public void onClick(View view) {
/**
* 构建出一个Intent对象,并把要发送的广播的值传入,然后调用了Context的sendBroadcast()方法将广播发送出去
* 这样所有监听com.nyl.custombroadcast.MyBroadcastReceiver这条广播的广播接收器就会收到消息。
*/
Intent intent = new Intent("com.nyl.custombroadcast.MyBroadcastReceiver");
sendBroadcast(intent);
}
}
运行程序,点击一下发送广播按钮,效果如下图:
这样我们就成功完成了发送自定义广播的功能了。
2.2、发送有序广播
接收者通过Bundle bundle = new getResultExtras(true)可以获取上一个接收者存入的数据,定义了两个AnotherBroadcastReceiver类,如下所示:
package com.nyl.orderlybroadcast; import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.widget.Toast; public class AnotherBroadcastReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"收到广播接收器",Toast.LENGTH_SHORT).show();
//创建一个Bundle对象,并存入数据
Bundle bundle = new Bundle();
bundle.putString("first","有序广播");
//将bundle放入结果中
setResultExtras(bundle);
//取消Broadcast的继续发送,也就是将广播截断,不再发给下一个广播接收器
abortBroadcast();
}
}
package com.nyl.orderlybroadcast; import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.widget.Toast; public class AnotherBroadcastReceiver1 extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
Bundle bundle = getResultExtras(true);
//解析前一个BroadcastReceiver所存入的key为first的消息
String first = bundle.getString("first");
Toast.makeText(context,"第一个广播存入的消息为:" + first,Toast.LENGTH_SHORT).show();
}
}
在AndroidManifest.xml中对该AnotherBroadcastReceiver进行注册,添加开机广播的intent-filter,然后android:priority属性给广播接收器设置了优先级,优先级比较高的广播接收器就可以先收到广播。如下图所示:
还是跟发送标准的一样,定义一个简单的按钮,用于作为发送广播的触发点,然后在MainActivity中完成发送按钮,代码如下所示:
package com.nyl.orderlybroadcast; import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button; public class MainActivity extends Activity implements View.OnClickListener { private Button btnOrderlyBroadcast; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnOrderlyBroadcast = (Button) findViewById(R.id.btnOrderlyBroadcast);
btnOrderlyBroadcast.setOnClickListener(this);
} @Override
public void onClick(View view) {
Intent intent = new Intent("com.nyl.orderlybroadcast.AnotherBroadcastReceiver");
/**
* sendOrderedBroadcast()方法接收两个参数:第一个参数是intent
* 第二个是一个与权限相关的字符串,这里传入null就行了
*/
sendOrderedBroadcast(intent,null);
}
}
注:如果把AnotherBroadcastReceiver的abortBroadcast()这个方法注释掉,那么AnotherBroadcastReceiver1也会收到广播,按照配置的接收优先级顺序,AnotherBroadcastReceiver会先接收到,然后才到AnotherBroadcastReceiver1,效果如下图:
关于广播的内容介绍就这么多,内容有写得不对的地方,欢迎广大园友指正!
Android学习总结(六)———— 发送自定义广播的更多相关文章
- MIUI7,Android版本5.0.2,一个程序发送自定义广播,另一个程序没有接收到
对照<第一行代码——Android>进行学习,第五章中说到广播包的相关知识,前面获取广播等程序例程都可以跑的通,但是在5.3.2节中,程序A发送自定义广播,并接收自定义广播,同时程序B也接 ...
- android 发送自定义广播以及接收自定义广播
发送自定义广播程序: 布局文件: <?xml version="1.0" encoding="utf-8"?> <LinearLayout x ...
- android: 发送自定义广播
5.3.1 发送标准广播 在发送广播之前,我们还是需要先定义一个广播接收器来准备接收此广播才行,不然发 出去也是白发.因此新建一个 MyBroadcastReceiver 继承自 Broadca ...
- android#boardcast#发送自定义广播
广播主要分为两种类型,标准广播和有序广播,通过实践的方式来看下这两种广播具体的区别. 一.发送标准广播 在发送广播之前,我们还是需要先定义一个广播接收器来准备接收此广播才行,不然发出去也是白发.因此新 ...
- Android 发送自定义广播(标准和本地)
1.首先自定义一个广播接收器:MyBroadcastReceiver package example.com.mybroadcastreceiver; import android.content.B ...
- 【Android】完善Android学习(六:API 4.0)
备注:之前Android入门学习的书籍使用的是杨丰盛的<Android应用开发揭秘>,这本书是基于Android 2.2API的,目前Android已经到4.4了,更新了很多的API,也增 ...
- Android学习笔记--Broadcast, BroadcastReceiver(广播)
参考资料:http://www.cnblogs.com/playing/archive/2011/03/23/1992030.html 在 Android 中使用 Activity, Service, ...
- Android学习笔记(十三)——广播机制
//此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! Android 中的每个应用程序都可以对自己感兴趣的广播进行注册,这样该程序就只会接收到自己所关心的广播内容 ...
- android 学习随笔十八(广播与服务 )
1.广播接收者注册 清单文件注册(Android四大组件都要在清单文件中注册) 一旦应用部署,广播接收者就生效了,直到用户手动停止应用或者应用被删除 广播接收者可以使用代码注册 需要广播接收者运行时, ...
随机推荐
- U盘安装 Linux 显示 “Faild to copy file from CD-ROM”
解决方案 使用 UltraISO 刻录 U盘做镜像时,出现这种情况.查阅别人的 blog,尝试手动挂载发现还是不能成功.然后使用 win32diskimager 重新刻录,再次安装时未出现该情况. 参 ...
- Git简单教程
该笔记总结廖雪峰Git教程, 参考网站: https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017 ...
- Beyond Compare 简体版+注册码
Beyond Compare 3.3.4.14431 官方简体版+注册码 查阅全文 ›
- CF-799A
A. Carrot Cakes time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...
- 利用python数据分析panda学习笔记之DataFrame
2 DataFrame a:通过传入一个等长的列表构成DataFrame 自动加上索引 data={'state':['ohio','ohio','ohio','Nevada','Nevada'], ...
- python---socket与socketserver
1.socket的方socket.getaddrinfo(host, port, family=0, type=0, proto=0, flags=0) #获取要连接的对端主机地址sk.bind(ad ...
- HTML学习笔记(三)样式CSS
1.样式 外部样式表(通过css文件定义样式,整体样式) 当样式需要被应用到很多页面的时候,使用外部样式表,在 head 部分<link>. <head> <link r ...
- 删除链表中的倒数第n个元素
示例: 输入链表:1->2->3->4->5 , 2 输出:1->2->3->5 Python解决方案1: # Definition for singly-l ...
- CodeForces 644B【模拟】
题意: 查询数 和 最大的队列容量+1: 按时间顺序 ti代表,第i个出线的时间: di代表,第i个需要处理的时间: 对于第i个输出他所需要的时间完成,或者拒绝进入输出-1: 思路: 真是MDZZ了, ...
- [Xcode 实际操作]七、文件与数据-(15)单例模式的使用
目录:[Swift]Xcode实际操作 本文将演示单例对象的使用. 在项目名称上点击鼠标右键,弹出右键菜单,选择[New File]新建文件命令, 在弹出的模板选项窗口中,选择[Swift]文件选项, ...