【Android基础入门〖5〗】四大组件之BroadcastReceiver

[+]

0  简介

       BroadcastReceiver也就是“广播接收者”的意思,顾名思义,它就是用来接收来自系统和应用中的
广播。
       在Android系统中,广播体现在方方面面,例如当开机完成后系统会产生一条广播,接收到这条广播
就能实现开机启动服务的功能;当网络状态改变时系统会产生一条广播,接收到这条广播就能及时地做出提
示和保存数据等操作;当电池电量改变时,系统会产生一条广播,接收到这条广播就能在电量低时告知用户
及时保存进度,等等。
       Android中的广播机制设计的非常出色,很多事情原本需要开发者亲自操作的,现在只需等待广播告
知自己就可以了,大大减少了开发的工作量和开发周期。

1  普通广播

       普通广播对于多个接收者来说是完全异步的,通常每个接收者都无需等待即可以接收到广播,接收者相互之
间不会有影响。对于这种广播,接收者无法终止广播,即无法阻止其他接收者的接收动作。
动态接收器高优先级 > 动态接收器低优先级 > 静态接收器高优先级 > 静态接收器低优先级
 

    1.1 自定义广播 MyReceiver.java

  1. package com.broadcastreceiver;  
  2. import android.content.BroadcastReceiver;  
  3. import android.content.Context;  
  4. import android.content.Intent;  
  5. import android.widget.Toast;  
  6. public class MyReceiver extends BroadcastReceiver {  
  7.     @Override  
  8.     public void onReceive(Context context, Intent intent) {  
  9.         // TODO 自动生成的方法存根  
  10.         Toast.makeText(context, intent.getAction()+intent.getStringExtra("message"), Toast.LENGTH_SHORT).show();  
  11.     }  
  12. }  


    1.2 注册广播

  1. <receiver android:name="com.broadcastreceiver.MyReceiver">  
  2.     <intent-filter >  
  3.         <action android:name="michael.FIRSTRECEIVER"/>  
  4.     </intent-filter>  
  5. </receiver>  

    1.3 发送广播

  1. package com.broadcastreceiver;  
  2. import android.app.Activity;  
  3. import android.content.Intent;  
  4. import android.os.Bundle;  
  5. import android.view.View;  
  6. import android.view.View.OnClickListener;  
  7. import android.widget.Button;  
  8. public class MainActivity extends Activity {  
  9.     @Override  
  10.     protected void onCreate(Bundle savedInstanceState) {  
  11.         super.onCreate(savedInstanceState);  
  12.         setContentView(R.layout.activity_main);  
  13.           
  14.         Button btn_send=(Button)findViewById(R.id.btn_send);  
  15.         btn_send.setOnClickListener(new OnClickListener() {  
  16.               
  17.             @Override  
  18.             public void onClick(View v) {  
  19.                 Intent intent=new Intent();  
  20.                 intent.setAction("michael.FIRSTRECEIVER");  
  21.                 intent.putExtra("message""我是神奇的广播消息!");  
  22.                 sendBroadcast(intent);  
  23.             }  
  24.         });  
  25.     }  
  26. }  


2  有序广播

       有序广播比较特殊,它每次只发送到优先级较高的接收者那里,然后由优先级高的接受者再传播到优先级低
的接收者那里,优先级高的接收者有能力终止这个广播
如果静态接收器的优先级高于动态接收器的优先级,那么还是静态接收器先接收到广播(比如接收短信)
 

    2.1 在前一节的基础上再新建个 广播 YourReceiver.java

  1. package com.broadcastreceiver;  
  2. import android.content.BroadcastReceiver;  
  3. import android.content.Context;  
  4. import android.content.Intent;  
  5. import android.os.Bundle;  
  6. import android.widget.Toast;  
  7. public class YourReceiver extends BroadcastReceiver {  
  8.     @Override  
  9.     public void onReceive(Context context, Intent intent) {  
  10.         Bundle bundle=getResultExtras(true);  
  11.         String first=bundle.getString("first");  
  12.         Toast.makeText(context, "上一个接收器转播的数据为:"+first, Toast.LENGTH_LONG).show();  
  13.     }  
  14. }  


     2.2 代码注册广播

  1. package com.broadcastreceiver;  
  2. import android.app.Activity;  
  3. import android.content.Intent;  
  4. import android.content.IntentFilter;  
  5. import android.os.Bundle;  
  6. import android.view.View;  
  7. import android.view.View.OnClickListener;  
  8. import android.widget.Button;  
  9. public class MainActivity extends Activity {  
  10.     YourReceiver yourreceiver=null;  
  11.     @Override  
  12.     protected void onCreate(Bundle savedInstanceState) {  
  13.         super.onCreate(savedInstanceState);  
  14.         setContentView(R.layout.activity_main);  
  15.           
  16.         yourreceiver=new YourReceiver();  
  17.         Button btn_send=(Button)findViewById(R.id.btn_send);  
  18.         btn_send.setOnClickListener(new OnClickListener() {  
  19.               
  20.             @Override  
  21.             public void onClick(View v) {  
  22.                 Intent intent=new Intent();  
  23.                 intent.setAction("michael.FIRSTRECEIVER");  
  24.                 intent.putExtra("message""我是神奇的广播消息!");  
  25.                 sendBroadcast(intent);  
  26.             }  
  27.         });  
  28.           
  29.         //代码动态注册广播  
  30.         IntentFilter filter=new IntentFilter();  
  31.         filter.addAction("michael.FIRSTRECEIVER");  
  32.         filter.setPriority(10);  
  33.         registerReceiver(yourreceiver, filter);  
  34.     }  
  35.     @Override  
  36.     protected void onDestroy() {  
  37.         //程序退出前取消注册广播  
  38.         unregisterReceiver(yourreceiver);  
  39.         super.onDestroy();  
  40.     }  
  41. }  

广播的发送不局限于当前应用程序,其它程序发送广播的话也可接收到。

2.3  接收优先级

       静态接收器优先级低于动态接收器,也就是说,无论多么高级别的静态接收器和多么低级别的动态接收器都
接收同一广播,永远都是动态接收器先接收到(相对于普通广播)
       动态接收器也可以设置优先级,高优先级的接收器会在低优先级的接收器之前接收到广播,同样优先级的动
态接收器,谁先注册到系统,谁就抢先接收到广播。
 
举例:
假设有如下优先级的5个接收器
1.动态A(优先级=1)
2.动态B(优先级=2)
3.动态C(优先级=2)
4.静态D(优先级=1)
5.静态E(优先级=2)并且B先于C注册
 
普通广播接收的顺序
B C A E D    (动态接收器高优先级 > 动态接收器低优先级 > 静态接收器高优先级 > 静态接收器低优先级 )
有序广播接收的顺序
B C E A D    (如果静态接收器的优先级高于动态接收器的优先级,那么还是静态接收器先接收到广播)
 
这是在一片博客上看到的图,忘记原创地址了,罪过啊

 
 
 
 
 
 注:转载请注明出处 :)   毕竟代码是一个一个敲出来的啊,O(∩_∩)O~
 
原:http://blog.csdn.net/mkrcpp/article/details/11992647
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值