Android中BroadcastReceiver组件具体解释
Android系统的4个组件最终还剩一种组件了BroadcastReceiver,这个组件是全局监听器,能够监听系统全局的广播消息,能够方便的实现系统中不同组件之间的通信
BroadcastReceiver有自己的进程,系统级监听器,仅仅要存在与之匹配的Intent被广播出来,BroadcastReceiver就会被激发
要创建自己的BroadcastReceiver对象,我们须要继承android.content.BroadcastReceiver,并实现其onReceive方法
MyReceiver.java
public class MyReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
Toast.makeText(context,
"接收到的Intent的Action为:" + intent.getAction()
+ "\n消息内容是:" + intent.getStringExtra("msg")
, Toast.LENGTH_LONG).show();
}
}
Manifest.xml清单文件配置的receiver
<receiver android:name=".MyReceiver">
<intent-filter>
<action android:name="org.crazyit.action.CRAZY_BROADCAST" />
</intent-filter>
</receiver>
就是说不管哪个组件中,intent的Action是"org.crazyit.action.CRAZY_BROADCAST" 并使用使用sendBroadcast(intent)发出广播,那么MyReceiver就会被启动
public class BroadcastMain extends Activity
{
Button send; @Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 获取程序界面中的button
send = (Button) findViewById(R.id.send);
send.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
// 创建Intent对象
Intent intent = new Intent();
// 设置Intent的Action属性
intent.setAction("org.crazyit.action.CRAZY_BROADCAST");
intent.putExtra("msg", "简单的消息");
// 发送广播
sendBroadcast(intent);
}
});
}
}
注冊Receiver有两种方法:
静态注冊
静态注冊是在AndroidManifest.xml文件里配置的。我们就来为MyReceiver注冊一个广播地址:
<receiver android:name=".MyReceiver">
<intent-filter>
<action android:name="android.intent.action.MY_BROADCAST"/>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
配置了以上信息之后。仅仅要是android.intent.action.MY_BROADCAST这个地址的广播,MyReceiver都可以接收的到。注意,这样的方式的注冊是常驻型的。也就是说当应用关闭后,假设有广播信息传来,MyReceiver也会被系统调用而自己主动执行。
动态注冊
动态注冊须要在代码中动态的指定广播地址并注冊,通常我们是在Activity或Service注冊一个广播,以下我们就来看一下注冊的代码:
MyReceiver receiver = new MyReceiver(); IntentFilter filter = new IntentFilter();
filter.addAction("android.intent.action.MY_BROADCAST"); registerReceiver(receiver, filter); //注冊<pre name="code" class="java">receiver 和filter
普通广播
普通广播对于多个接收者来说是全然异步的。通常每一个接收者都无需等待即能够接收到广播,接收者相互之间不会有影响。
对于这样的广播。接收者无法终止广播。即无法阻止其它接收者的接收动作。
上面的样例就是发送的普通广播
有序广播
有序广播比較特殊,它每次仅仅发送到优先级较高的接收者那里,然后由优先级高的接受者再传播到优先级低的接收者那里。优先级高的接收者有能力终止这个广播。
比如:优先级A>B>C,Broadcast先传给A。再传给B,在传给C。优先级别声明<Intent-filter>元素的android:priority中。数越大级别越高,取值范围在-1000~1000
优先收到Broadcast的接受者能够通过setResultExtras(Bundle)方法将处理结果存入Broadcast中,然后传给下一个接受者。通过Bundle bunde=getResultExtras(true)柯获得上一个接受者存入的数据
public class SortedBroadcast extends Activity
{
Button send; @Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 获取程序中的sendbutton
send = (Button) findViewById(R.id.send);
send.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
// 创建Intent对象
Intent intent = new Intent();
intent.setAction("org.crazyit.action.CRAZY_BROADCAST");
intent.putExtra("msg", "简单的消息");
// 发送有序广播
sendOrderedBroadcast(intent, null);
}
});
}
}
MyReceiver.java
public class MyReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
Toast.makeText(context, "接收到的Intent的Action为:"
+ intent.getAction() + "\n消息内容是:"
+ intent.getStringExtra("msg")
, Toast.LENGTH_LONG).show();
// 创建一个Bundle对象,并存入数据
Bundle bundle = new Bundle();
bundle.putString("first", "第一个BroadcastReceiver存入的消息");
// 将bundle放入结果中
setResultExtras(bundle);
// 取消Broadcast的继续传播
// abortBroadcast(); //①
}
}
MyReceiver2.java
public class MyReceiver2 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, "第一个Broadcast存入的消息为:"
+ first, Toast.LENGTH_LONG).show();
}
}
清单文件
<receiver android:name=".MyReceiver">
<intent-filter android:priority="20">
<action android:name="org.crazyit.action.CRAZY_BROADCAST" />
</intent-filter>
</receiver>
<receiver android:name=".MyReceiver2">
<intent-filter android:priority="0">
<action android:name="org.crazyit.action.CRAZY_BROADCAST" />
</intent-filter>
</receiver>
Android中BroadcastReceiver组件具体解释的更多相关文章
- Android中BroadcastReceiver的两种注册方式(静态和动态)详解
今天我们一起来探讨下安卓中BroadcastReceiver组件以及详细分析下它的两种注册方式. BroadcastReceiver也就是"广播接收者"的意思,顾名思义,它就是用来 ...
- android中四大组件之间相互通信
好久没有写有关android有关的博客了,今天主要来谈一谈android中四大组件.首先,接触android的人,都应该知道android中有四大组件,activity,service,broadca ...
- Android中Intent组件详解
Intent是不同组件之间相互通讯的纽带,封装了不同组件之间通讯的条件.Intent本身是定义为一个类别(Class),一个Intent对象表达一个目的(Goal)或期望(Expectation),叙 ...
- Android中的动画具体解释系列【4】——Activity之间切换动画
前面介绍了Android中的逐帧动画和补间动画,并实现了简单的自己定义动画.这一篇我们来看看怎样将Android中的动画运用到实际开发中的一个场景--Activity之间跳转动画. 一.定义动画资源 ...
- Android中时间戳的详细解释
Android中时间戳的详细解释: (1).定义: 时间戳就是根据当前系统时间生成的一组随机数字. (2).作用: 作为对数据唯一性的一种判断依据.避免了重复修改数据所带来的错误! (3).应用: ( ...
- Android中BroadcastReceiver广播
BroadCastReceiver 简介 广播接收者( BroadcastReceiver )用于接收广播 Intent ,广播 Intent 的发送是通过调用 Context.sendBroadca ...
- Android的BroadcastReceiver组件
BroadcastReceiver的作用: BroadcastReceiver,是和Intent有很大关系的Android组件. Android中的 Intent 可以用来: 1. 在应用程序内部和应 ...
- Android中BroadcastReceiver的使用
1.Android中广播分为静态注册和动态注册 2.下面是一个简单静态注册的例子 创建一个继承BroadcastReceiver的子类 public class DeviceBootReceiver ...
- Android中ViewStub组件使用
1. 概述: ViewStub组件和<include>标签的作用类似,主要是为了提高布局的重用性,及布局的模块化.它们之间最大的差别是,ViewStub中的布局不会随着它所在布局的渲染而渲 ...
随机推荐
- MQTT---HiveMQ源代码具体解释(四)插件载入
源博客地址:http://blog.csdn.net/pipinet123 MQTT交流群:221405150 实现功能 将全部放在plugins文件夹下的全部符合plugin编写规范的plugin ...
- js 给json添加新的字段,或者添加一组数据,在JS数组指定位置删除、插入、替换元素
JS定义了一个json数据var test={name:"name",age:"12"};需要给test再添加一个字段,需要什么办法,可以让test的值为{na ...
- js判断是否包含指定字符串
CreateTime--2017年2月28日09:37:06Author:Marydonjs判断是否包含指定字符串 var inputValue = "thunder://piaohua ...
- 一致Hash算法
一致性哈希算法是分布式系统中经常使用的算法.比方,一个分布式的存储系统,要将数据存储到详细的节点上.假设採用普通的hash方法.将数据映射到详细的节点上,如key%N.key是数据的key.N是机器节 ...
- POJ 2112 Optimal Milking(最大流)
题目链接:http://poj.org/problem?id=2112 Description FJ has moved his K (1 <= K <= 30) milking mach ...
- 【BIRT】Format Number下的Round Mode中的各项解释
页面展示 从上图我们可以才看出,共有Half Up.Half Down.Half Even.Up.Down.Celling.Floor.Unnecessary 下面一一介绍每一个的意思 Half Up ...
- BeanUtils的介绍使用
BeanUtils工具 在实际的开发中我们经常需要将用户的录入的数据进行封装为对象,那么如果使用反射和内省技术就会变得吃力.因此本节主要给大家讲解一个开源的操作JavaBean的一个工具即BeanUt ...
- 简单hello world
第一步配置路由: 打开app/http/route.php文件,输入:Route::get('/home', 'HomeController@index'); 第二步配置控制器: 控制文件可以手动添加 ...
- jQuery knowledge
I have used jquery for many years, but didn't list the problem I ever meeting, so here is a list of ...
- numpy和matplotlib绘制直方图
使用 Matplotlib Matplotlib 中有直方图绘制函数:matplotlib.pyplot.hist()它可以直接统计并绘制直方图.你应该使用函数 calcHist() 或 np.his ...