Android之BroadcastReceiver

来源:互联网 发布:数据结构设计怎么写 编辑:程序博客网 时间:2024/06/06 02:53

简介:

BroadcastReceiver本质上就是一种全局的监听器,用于监听系统全局的广播消息,因此它可以非常方便地实现系统中不同组件之间的通信。


特点:

1.BroadcastReceiver用于接收程序所发出的Broadcast Intent,与应用程序启动Activity、Service相同;

2.当应用程序发出一个Broadcast Intent之后,所有匹配该Intent的BroadcastReceiver都有可能被启动;


用法:

网上流行的一张图片可以很好的感受到broadcastreceiver的主要用法:



本次我们通过一个小的示例来一起学习BroadcastReceiver:

建立三个广播类,前两个在manifest里面注册,称为静态注册,最后一个没有在manifest里面注册而在代码中注册,称为动态注册,发送广播的时候有显示发送和隐式发送两种区别。

首先我们来看一下三个广播接收器类的定义以及manifest里面的片段内容如下:

[java] view plain copy 在CODE上查看代码片派生到我的代码片
  1. import android.content.BroadcastReceiver;  
  2. import android.content.Context;  
  3. import android.content.Intent;  
  4. import android.widget.Toast;  
  5.   
  6. public class MyReceiver01 extends BroadcastReceiver{  
  7.   
  8.     @Override  
  9.     public void onReceive(Context context, Intent intent) {  
  10.           
  11.         String msg = intent.getExtras().getString("data");  
  12.           
  13.         Toast.makeText(context, "MyReceiver01收到消息:" + msg, Toast.LENGTH_SHORT).show();  
  14.           
  15.     }  
  16.   
  17. }  

[java] view plain copy 在CODE上查看代码片派生到我的代码片
  1. import android.content.BroadcastReceiver;  
  2. import android.content.Context;  
  3. import android.content.Intent;  
  4. import android.widget.Toast;  
  5.   
  6. public class MyReceiver02 extends BroadcastReceiver {  
  7.   
  8.     @Override  
  9.     public void onReceive(Context context, Intent intent) {  
  10.         String msg = intent.getExtras().getString("data");  
  11.   
  12.         Toast.makeText(context, "MyReceiver02收到消息:" + msg, Toast.LENGTH_SHORT)  
  13.                 .show();  
  14.     }  
  15.   
  16. }  

[java] view plain copy 在CODE上查看代码片派生到我的代码片
  1. public class MyReceiver03 extends BroadcastReceiver {  
  2.   
  3.     public final static String INTENT_ACTION_MYRECEIVER03 = "com.bear.broadcastreceiver.intent.action.receiver03";  
  4.   
  5.     @Override  
  6.     public void onReceive(Context context, Intent intent) {  
  7.         String msg = intent.getExtras().getString("data");  
  8.   
  9.         Toast.makeText(context, "MyReceiver03收到消息:" + msg, Toast.LENGTH_SHORT)  
  10.                 .show();  
  11.           
  12. //      abortBroadcast(); 取消广播,后续receiver将无法接收到消息  
  13.     }  
  14.   
  15. }  

[html] view plain copy 在CODE上查看代码片派生到我的代码片
  1. <receiver android:name="com.bear.broadcastreceiver.MyReceiver01" ></receiver>  
  2.   
  3. <receiver android:name="com.bear.broadcastreceiver.MyReceiver02">  
  4.     <intent-filter >  
  5.         <action android:name="com.bear.broadcastreceiver.intent.action.receiver02"/>  
  6.     </intent-filter>  
  7.       
  8. </receiver>  


主界面共有5个按钮用来测试,主界面类的定义如下:

[java] view plain copy 在CODE上查看代码片派生到我的代码片
  1. import android.app.Activity;  
  2. import android.content.Intent;  
  3. import android.content.IntentFilter;  
  4. import android.os.Bundle;  
  5. import android.view.View;  
  6. import android.view.View.OnClickListener;  
  7.   
  8. public class MainActivity extends Activity implements OnClickListener{  
  9.   
  10.     private IntentFilter intentFilter;  
  11.     private MyReceiver03 receiver;  
  12.       
  13.     @Override  
  14.     protected void onCreate(Bundle savedInstanceState) {  
  15.         super.onCreate(savedInstanceState);  
  16.         setContentView(R.layout.activity_main);  
  17.         setupViews();  
  18.           
  19.         intentFilter = new IntentFilter(MyReceiver03.INTENT_ACTION_MYRECEIVER03);  
  20.         receiver = new MyReceiver03();  
  21.     }  
  22.       
  23.     @Override  
  24.     public void onClick(View v) {  
  25.           
  26.           
  27.         switch (v.getId()) {  
  28.         case R.id.button1:  
  29.             //显式发送广播  
  30.             Intent intent = new Intent(MainActivity.this, MyReceiver01.class);  
  31.             intent.putExtra("data""bear");  
  32.             sendBroadcast(intent);  
  33.             break;  
  34.         case R.id.button2:  
  35.             //隐式发送广播  
  36.             Intent intent02 = new Intent("com.bear.broadcastreceiver.intent.action.receiver02");  
  37.             intent02.putExtra("data""bear02");  
  38.             sendBroadcast(intent02);  
  39.             break;  
  40.         case R.id.button3:  
  41.             //动态注册广播  
  42.             registerReceiver(receiver, intentFilter);  
  43.             break;  
  44.         case R.id.button4:  
  45.             Intent intent03 = new Intent(MyReceiver03.INTENT_ACTION_MYRECEIVER03);  
  46.             intent03.putExtra("data""bear03");  
  47.             sendBroadcast(intent03);  
  48. //          sendOrderedBroadcast(intent03, receiverPermission); 按优先级发送广播  
  49.             break;  
  50.         case R.id.button5:  
  51.             //注销广播  
  52.             unregisterReceiver(receiver);  
  53.             break;  
  54.   
  55.         default:  
  56.             break;  
  57.         }  
  58.           
  59.     }  
  60.       
  61.     private void setupViews(){  
  62.         findViewById(R.id.button1).setOnClickListener(this);  
  63.         findViewById(R.id.button2).setOnClickListener(this);  
  64.         findViewById(R.id.button3).setOnClickListener(this);  
  65.         findViewById(R.id.button4).setOnClickListener(this);  
  66.         findViewById(R.id.button5).setOnClickListener(this);  
  67.           
  68.     }  
  69.   
  70.       
  71. }  


总结:

1. 每次系统广播(Broadcast)事件发生后,系统就会创建对应的BroadcastReceiver实例,并自动触发它的onReceive()方法,onReceive()方法执行完后,BroadcastReceiver的实例就会被销毁;


2.如果BroadcastReceiver的onReceive()方法不能在10秒内执行完成,Android会认为该程序无响应。所以不要在广播接收者的onReceive()方法里执行一些耗时的操作,否则会弹出ANR(Application No Response)的对话框


3.如果确实需要根据广播来完成一项比较耗时的操作,则可以考虑通过Intent启动一个Service来完成该操作。不应考虑使用新线程去完成耗时的操作,因为BroadcastReceiver本身的生命周期极短,可能出现的情况是子线程可能还没有结束,BroadcastReceiver就已经退出了;


最后在这里附上整个demo工程源码:Android BroadcastReceiver
0 0
原创粉丝点击