Android系统组件BroadcastReceiver

Android系统的4个组件终于还剩一种组件了BroadcastReceiver,这个组件是全局监听器,可以监听系统全局的广播消息,可以方便的实现系统中不同组件之间的通信

BroadcastReceiver有自己的进程,系统级监听器,只要存在与之匹配的Intent被广播出来,BroadcastReceiver就会被激发


要创建自己的BroadcastReceiver对象,我们需要继承android.content.BroadcastReceiver,并实现其onReceive方法

MyReceiver.java

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public class MyReceiver extends BroadcastReceiver  
  2. {  
  3.     @Override  
  4.     public void onReceive(Context context, Intent intent)  
  5.     {  
  6.         Toast.makeText(context,  
  7.             "接收到的Intent的Action为:" + intent.getAction()   
  8.             + "\n消息内容是:" + intent.getStringExtra("msg")  
  9.             , Toast.LENGTH_LONG).show();  
  10.     }  
  11. }  
Manifest.xml清单文件配置的receiver

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <receiver android:name=".MyReceiver">  
  2.     <intent-filter>  
  3.         <action android:name="org.crazyit.action.CRAZY_BROADCAST" />  
  4.     </intent-filter>        
  5. </receiver>  
就是说无论哪个组件中,intent的Action是"org.crazyit.action.CRAZY_BROADCAST" 并使用使用sendBroadcast(intent)发出广播,那么MyReceiver就会被启动

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public class BroadcastMain extends Activity  
  2. {  
  3.     Button send;  
  4.   
  5.     @Override  
  6.     public void onCreate(Bundle savedInstanceState)  
  7.     {  
  8.         super.onCreate(savedInstanceState);  
  9.         setContentView(R.layout.main);  
  10.         // 获取程序界面中的按钮  
  11.         send = (Button) findViewById(R.id.send);  
  12.         send.setOnClickListener(new OnClickListener()  
  13.         {  
  14.             @Override  
  15.             public void onClick(View v)  
  16.             {  
  17.                 // 创建Intent对象  
  18.                 Intent intent = new Intent();  
  19.                 // 设置Intent的Action属性  
  20.                 intent.setAction("org.crazyit.action.CRAZY_BROADCAST");  
  21.                 intent.putExtra("msg""简单的消息");  
  22.                 // 发送广播  
  23.                 sendBroadcast(intent);  
  24.             }  
  25.         });  
  26.     }  
  27. }  


注册Receiver有两种方法:

静态注册

静态注册是在AndroidManifest.xml文件中配置的,我们就来为MyReceiver注册一个广播地址:

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <receiver android:name=".MyReceiver">    
  2.             <intent-filter>    
  3.                 <action android:name="android.intent.action.MY_BROADCAST"/>    
  4.                 <category android:name="android.intent.category.DEFAULT" />    
  5.             </intent-filter>    
  6.         </receiver>   

配置了以上信息之后,只要是android.intent.action.MY_BROADCAST这个地址的广播,MyReceiver都能够接收的到。注意,这种方式的注册是常驻型的,也就是说当应用关闭后,如果有广播信息传来,MyReceiver也会被系统调用而自动运行。

动态注册

动态注册需要在代码中动态的指定广播地址并注册,通常我们是在Activity或Service注册一个广播,下面我们就来看一下注册的代码:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. MyReceiver receiver = new MyReceiver();    
  2.             
  3. IntentFilter filter = new IntentFilter();    
  4. filter.addAction("android.intent.action.MY_BROADCAST");    
  5.             
  6. 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)柯获得上一个接受者存入的数据

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public class SortedBroadcast extends Activity  
  2. {  
  3.     Button send;  
  4.   
  5.     @Override  
  6.     public void onCreate(Bundle savedInstanceState)  
  7.     {  
  8.         super.onCreate(savedInstanceState);  
  9.         setContentView(R.layout.main);  
  10.         // 获取程序中的send按钮  
  11.         send = (Button) findViewById(R.id.send);  
  12.         send.setOnClickListener(new OnClickListener()  
  13.         {  
  14.             @Override  
  15.             public void onClick(View v)  
  16.             {  
  17.                 // 创建Intent对象  
  18.                 Intent intent = new Intent();  
  19.                 intent.setAction("org.crazyit.action.CRAZY_BROADCAST");  
  20.                 intent.putExtra("msg""简单的消息");  
  21.                 // 发送有序广播  
  22.                 sendOrderedBroadcast(intent, null);  
  23.             }  
  24.         });  
  25.     }  
  26. }  
MyReceiver.java

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public class MyReceiver extends BroadcastReceiver  
  2. {  
  3.     @Override  
  4.     public void onReceive(Context context, Intent intent)  
  5.     {  
  6.         Toast.makeText(context, "接收到的Intent的Action为:"   
  7.             + intent.getAction() + "\n消息内容是:"  
  8.             + intent.getStringExtra("msg")  
  9.             , Toast.LENGTH_LONG).show();  
  10.         // 创建一个Bundle对象,并存入数据  
  11.         Bundle bundle = new Bundle();  
  12.         bundle.putString("first""第一个BroadcastReceiver存入的消息");  
  13.         // 将bundle放入结果中  
  14.         setResultExtras(bundle);  
  15.         // 取消Broadcast的继续传播  
  16.         // abortBroadcast(); //①  
  17.     }  
  18. }  
MyReceiver2.java

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public class MyReceiver2 extends BroadcastReceiver  
  2. {  
  3.     @Override  
  4.     public void onReceive(Context context, Intent intent)  
  5.     {  
  6.         Bundle bundle = getResultExtras(true);  
  7.         // 解析前一个BroadcastReceiver所存入的key为first的消息  
  8.         String first = bundle.getString("first");  
  9.         Toast.makeText(context, "第一个Broadcast存入的消息为:"   
  10.             + first, Toast.LENGTH_LONG).show();  
  11.     }  
  12. }  
清单文件
[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <receiver android:name=".MyReceiver">  
  2.             <intent-filter android:priority="20">  
  3.                 <action android:name="org.crazyit.action.CRAZY_BROADCAST" />  
  4.             </intent-filter>        
  5.         </receiver>  
  6.         <receiver android:name=".MyReceiver2">  
  7.             <intent-filter android:priority="0">  
  8.                 <action android:name="org.crazyit.action.CRAZY_BROADCAST" />  
  9.             </intent-filter>        
  10.         </receiver>     
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值