从行为上广播类型有两种:
无序广播(Normal broadcasts):无序且并行执行广播
有序广播(Ordered broadcasts):有序地一个接一个执行广播
当通过意图发送广播时,无论BroadcastReceiver定义在当前应用还是其他应用中,只要BroadcastReceiver对此意图感兴趣(如:匹配Action),就会得到执行。
有序广播和无序广播默认都是运行在UI线程中的,当BroadcastReceiver在10秒内没有执行完毕,Android会认为该程序无响应,所以在BroadcastReceiver里不能做一些比较耗时的操作,否则会弹出ANR(Application No Response)的对话框。如果需要完成一项比较耗时的工作,应该通过Intent发送给Service,由Service来完成,而不是使用子线程的方法来解决,因为BroadcastReceiver的生命周期很短(在onReceive()执行后BroadcastReceiver的实例就会被销毁),子线程可能还没有结束BroadcastReceiver就先结束了。如果BroadcastReceiver结束了,它的宿主进程还在运行,那么子线程还会继续执行。但宿主进程此时很容易在系统需要内在时被优先杀死。因为它属于空进程(没有任何活动组件的进程)。
下面分别讲解这两种广播
无序广播:
示例中FirstBroadcastReceiver和SecondBroadcastReceiver在同一个应用中,ThirdBroadcastReceiver在另一个应用中。
他们的执行顺序是不可预知的。
应用A中代码:
定义两个BroadcastReceiver
public class FirstBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.i("CDH", "FirstBroadcastReceiver msg:"+intent.getStringExtra("msg"));
}
}
public class SecondBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.i("CDH", "SecondBroadcastReceiver msg:"+intent.getStringExtra("msg"));
}
}
AndroidManifest.xml中配置BroadcastReceiver
<receiver android:name=".FirstBroadcastReceiver">
<intent-filter>
<action android:name="com.improve.broadcast"/>
</intent-filter>
</receiver>
<receiver android:name=".SecondBroadcastReceiver">
<intent-filter>
<action android:name="com.improve.broadcast"/>
</intent-filter>
</receiver>
在一个名为BroadcastReceiverDemo的Activity中定义一个Button,点击事件如下
new OnClickListener() {
@Override
public void onClick(View button) {
//发送广播
Intent intent = new Intent("com.improve.broadcast");
intent.putExtra("msg", "I am BroadcastReceiverDemo Activity");
sendBroadcast(intent);
}
}
应用B中代码:
public class ThirdBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.i("CDH", "ThirdBroadcastReceiver msg:"+intent.getStringExtra("msg"));
}
}
AndroidManifest.xml中配置BroadcastReceiver
<receiver android:name=".ThirdBroadcastReceiver">
<intent-filter>
<action android:name="com.improve.broadcast"/>
</intent-filter>
</receiver>
运行结果
有序广播:
通过android:priority="N"设置广播执行顺序(N的取值-1000到1000),优先级高的广播先执行。(这里先执行SecondBroadcastReceiver再执行FirstBroadcastReceiver)
在前一个执行的广播中设置结果值,传给下一个广播。也可以通过
BroadcastReceiver.abortBroadcast()终止广播,后面的广播接收器不会得到执行。
定义两个BroadcastReceiver
public class FirstBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.i("CDH", "FirstBroadcastReceiver msg:"+intent.getStringExtra("msg"));
Bundle mBundle = this.getResultExtras(false);//true:前一个广播没有结果时创建新的Bundle;false:不创建Bundle
if (mBundle == null) {
Log.i("CDH", "没有获取到前一个运行的广播返回的数据");
} else {
Log.i("CDH", "前一个运行的广播返回的数据为:" + mBundle.getString("msg"));
}
}
}
public class SecondBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.i("CDH", "SecondBroadcastReceiver msg:"+intent.getStringExtra("msg"));
Bundle bundle = new Bundle();
bundle.putString("msg", "SecondBroadcastReceiver");
setResultExtras(bundle);
}
}
AndroidManifest.xml中配置BroadcastReceiver
<receiver android:name=".FirstBroadcastReceiver">
<intent-filter android:priority="1">
<action android:name="com.improve.broadcast"/>
</intent-filter>
</receiver>
<receiver android:name=".SecondBroadcastReceiver">
<intent-filter android:priority="2">
<action android:name="com.improve.broadcast"/>
</intent-filter>
</receiver>
在一个名为BroadcastReceiverDemo的Activity中定义一个Button,点击事件如下
new OnClickListener() {
@Override
public void onClick(View button) {
//发送广播
Intent intent = new Intent("com.improve.broadcast");
intent.putExtra("msg", "BroadcastReceiverDemo");
sendOrderedBroadcast(intent, null);
}
}
运行结果
分享到:
相关推荐
一般来说,都是在一个Activity启动的时候使用这样的方法注册BroadcastReceiver,一旦接收到广播的事件,就可以在onReceive方法当中更新当前的这个Activity当中的控件。但是需要注意的是如果这个Activity不可见了,就...
BroadcastReceiver,两种注册方式
Android中的BroadcastReceiver注册方式研究.pdf
这是一个关于Android中四大组件之一 —— BroadcastReceiver,即广播的一个demo,里面涉及到BroadcastReceiver的两种注册方式,也简单的实现了广播,通过点击按钮发送广播,收到广播后打印日志。
主要介绍了Android BroadcastReceiver广播注册方式总结的相关资料,需要的朋友可以参考下
BroadcastReceiver的两种注册方式:动态注册和静态注册的最简单的应用举例。以及广播的发送接收
主要介绍了Android采取BroadcastReceiver方式自动获取验证码,感兴趣的小伙伴们可以参考一下
主要介绍了Android Broadcast 和 BroadcastReceiver的权限限制方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
本文将介绍使用四大组件之一的BroadcastReceiver实现全局的网络状态监听,使用动态方式注册。 BroadcastReceiver的注册方式: (1)动态注册:即在代码中使用registerReceiver()方法进行注册,动态注册需要在onPause...
android广播实现方式
自己写的一个BroadcastReceiver的小例子,分两种注册方式去讲解。
今天我们一起来探讨下安卓中BroadcastReceiver组件以及详细分析下它的两种注册方式。 BroadcastReceiver也就是“广播接收者”的意思,顾名思义,它就是用来接收来自系统和应用中的广播。在Android系统中,广播体现在...
实现手机短信监听的方式有两种:一是通过ContentObserver观察者实现监听,另一种就是通过广播即BroadcastReceiver实现短信监听,文章中通过使用BroadcastReceiver实现有新短信的及时监听及包含设定的关键字时自动...
本例中是使用aidl Android Interface Definition Language 实现两种方式拦截来电 使用广播监听拦截(其中有动态广播注册和静态广播注册)和phoneManager类监听手机状态拦截
SmartGo Getting Start In your build.gradle: dependencies { compile 'go.smart.woaiwhz.smartgo:SmartGo:1.0.1' } Features Now you can launch an explicit Activity like this: SmartGo.from(this) ...
为了使其他的应用程序也可以访问本应用程序提供的服务,Android系统采用了远程过程调用(Remote Procedure Call,RPC)方式来实现。与很多其他的基于RPC的解决方案一样,Android使用一种接口定义语言(Interface ...