BroadcastReceiver使用方式

来源:互联网 发布:戴尔网络唤醒bios设置 编辑:程序博客网 时间:2024/06/10 23:17
从行为上广播类型有两种:
无序广播(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

[java] view plaincopy
  1. public class FirstBroadcastReceiver extends BroadcastReceiver {  
  2.     @Override  
  3.     public void onReceive(Context context, Intent intent) {  
  4.         Log.i("CDH""FirstBroadcastReceiver msg:"+intent.getStringExtra("msg"));  
  5.     }  
  6. }  
  7.   
  8. public class SecondBroadcastReceiver extends BroadcastReceiver {  
  9.     @Override  
  10.     public void onReceive(Context context, Intent intent) {  
  11.         Log.i("CDH""SecondBroadcastReceiver msg:"+intent.getStringExtra("msg"));  
  12.     }  
  13. }  

AndroidManifest.xml中配置BroadcastReceiver
[html] view plaincopy
  1. <receiver android:name=".FirstBroadcastReceiver">  
  2.     <intent-filter>  
  3.         <action android:name="com.improve.broadcast"/>  
  4.     </intent-filter>  
  5. </receiver>  
  6.   
  7. <receiver android:name=".SecondBroadcastReceiver">  
  8.     <intent-filter>  
  9.         <action android:name="com.improve.broadcast"/>  
  10.     </intent-filter>  
  11. </receiver>  

在一个名为BroadcastReceiverDemo的Activity中定义一个Button,点击事件如下
[java] view plaincopy
  1. new OnClickListener() {  
  2.     @Override  
  3.     public void onClick(View button) {  
  4.         //发送广播  
  5.         Intent intent = new Intent("com.improve.broadcast");  
  6.         intent.putExtra("msg""I am BroadcastReceiverDemo Activity");  
  7.         sendBroadcast(intent);  
  8.     }  
  9. }  


应用B中代码:

[java] view plaincopy
  1. public class ThirdBroadcastReceiver extends BroadcastReceiver {  
  2.     @Override  
  3.     public void onReceive(Context context, Intent intent) {  
  4.         Log.i("CDH""ThirdBroadcastReceiver msg:"+intent.getStringExtra("msg"));  
  5.     }  
  6. }  

AndroidManifest.xml中配置BroadcastReceiver
[html] view plaincopy
  1. <receiver android:name=".ThirdBroadcastReceiver">  
  2.     <intent-filter>  
  3.         <action android:name="com.improve.broadcast"/>  
  4.     </intent-filter>  
  5. </receiver>  

运行结果




有序广播:
通过android:priority="N"设置广播执行顺序(N的取值-1000到1000),优先级高的广播先执行。(这里先执行SecondBroadcastReceiver再执行FirstBroadcastReceiver)
在前一个执行的广播中设置结果值,传给下一个广播。也可以通过BroadcastReceiver.abortBroadcast()终止广播,后面的广播接收器不会得到执行。

定义两个BroadcastReceiver

[java] view plaincopy
  1. public class FirstBroadcastReceiver extends BroadcastReceiver {  
  2.     @Override  
  3.     public void onReceive(Context context, Intent intent) {  
  4.         Log.i("CDH""FirstBroadcastReceiver msg:"+intent.getStringExtra("msg"));  
  5.         Bundle mBundle = this.getResultExtras(false);//true:前一个广播没有结果时创建新的Bundle;false:不创建Bundle  
  6.         if (mBundle == null) {  
  7.             Log.i("CDH""没有获取到前一个运行的广播返回的数据");  
  8.         } else {  
  9.             Log.i("CDH""前一个运行的广播返回的数据为:" + mBundle.getString("msg"));  
  10.         }  
  11.     }  
  12. }  
  13.   
  14. public class SecondBroadcastReceiver extends BroadcastReceiver {  
  15.     @Override  
  16.     public void onReceive(Context context, Intent intent) {  
  17.         Log.i("CDH""SecondBroadcastReceiver msg:"+intent.getStringExtra("msg"));  
  18.         Bundle bundle = new Bundle();  
  19.         bundle.putString("msg""SecondBroadcastReceiver");  
  20.         setResultExtras(bundle);  
  21.     }  
  22. }  

AndroidManifest.xml中配置BroadcastReceiver
[html] view plaincopy
  1. <receiver android:name=".FirstBroadcastReceiver">  
  2.     <intent-filter android:priority="1">  
  3.         <action android:name="com.improve.broadcast"/>  
  4.     </intent-filter>  
  5. </receiver>  
  6.   
  7. <receiver android:name=".SecondBroadcastReceiver">  
  8.     <intent-filter android:priority="2">  
  9.         <action android:name="com.improve.broadcast"/>  
  10.     </intent-filter>  
  11. </receiver>  

在一个名为BroadcastReceiverDemo的Activity中定义一个Button,点击事件如下
[java] view plaincopy
  1. new OnClickListener() {  
  2.     @Override  
  3.     public void onClick(View button) {  
  4.         //发送广播  
  5.         Intent intent = new Intent("com.improve.broadcast");  
  6.         intent.putExtra("msg""BroadcastReceiverDemo");  
  7.         sendOrderedBroadcast(intent, null);  
  8.     }  
  9. }  

运行结果


原创粉丝点击