BroadcastReceiver

在OSI模型中,还记得数据链路层中ARP通过广播的方式获得通信对方的MAC地址么?假如在局域网中,两台主机之间相互通信,知道对方的IP地址是不行的,必须知道对方的MAC地址,此时通过ARP发送广播。但是ARP发送的广播和Android中的广播不是一回事。Android中的广播就如监听器,用于监听系统的广播消息,它可以实现系统中不同组件之间的通信。下面就介绍广播相关的知识点吧。

广播的分类:


官方文档说明主要有两种广播类型,

普通广播:Normal broadcast通过Context.sendBroadcast()被发送,完全异步的,可以在同一时刻被所有接受者所接受,消息传输效率很高,但是意味着接受者不能将处理结果传递给下一个接受者,并且无法终止广播的传播的缺点。

有序广播:通过Context.sendOrderedBroadcast()被发送,接受者按照声明的优先级(android:priority)依次接受Broadcast,优先级越高,先接受,并且可以接受到上一级处理结果。

四大组件都需要在AndroidManifest.xml中注册,广播有两种注册方式

静态注册:(在AndroidManifest.xml中注册)

[java] view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1.    <application  
  2.      ...>  
  3.      ...  
  4. ;receiver  
  5.         android:name=".MyReceiver" >  
  6.         <intent-filter android:priority="50" >    
  7.             <action android:name="com.example.lios" />     
  8.         </intent-filter>  
  9.     </receiver>  
  10.      ...  
  11. </application>  


动态注册:(在代码中注册)

[java] view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1.                             MyReceiver receiver = new MyReceiver();  
  2. IntentFilter filter = new IntentFilter();  
  3. filter.addAction("com.example.lios");  
  4. filter.setPriority(50);  
  5. registerReceiver(receiver, filter);  
下面通过一个demo简单说明:

布局文件,只是一个简单的Button:

[html] view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:paddingBottom="@dimen/activity_vertical_margin"  
  6.     android:paddingLeft="@dimen/activity_horizontal_margin"  
  7.     android:paddingRight="@dimen/activity_horizontal_margin"  
  8.     android:paddingTop="@dimen/activity_vertical_margin"  
  9.     android:gravity="center"  
  10.     tools:context="com.example.broadcastreceiver.MainActivity" >  
  11.   
  12.    <Button   
  13.        android:id="@+id/sendBroad"  
  14.        android:layout_height="wrap_content"  
  15.        android:layout_width="match_parent"  
  16.        android:text="发送广播" />  
  17. </RelativeLayout>  
第一个广播:
[java] view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. public class MyReceiver extends BroadcastReceiver {  
  2.   
  3.     @Override  
  4.     public void onReceive(Context context, Intent intent) {  
  5.         // TODO 自动生成的方法存根  
  6.         Toast.makeText(context,"接受到的Intent的Action为:" + intent.getAction()+"广播内容是:"+intent.getStringExtra("MSG")+"MyReceiver",Toast.LENGTH_SHORT).show();  
  7.           
  8.     }  
  9.   
  10. }  
第二个广播:

[java] view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. public class SecondReceiver extends BroadcastReceiver{  
  2.     @Override  
  3.     public void onReceive(Context context, Intent intent) {  
  4.         // TODO 自动生成的方法存根  
  5.         Toast.makeText(context,"接受到的Intent的Action为:" + intent.getAction()+"广播内容是:"+intent.getStringExtra("MSG")+"SecondReceiver",Toast.LENGTH_SHORT).show();  
  6.            // abortBroadcast(); 指定发送有序广播才会中断广播传递  
  7.     }  
  8. }  
MainActivity类:

[java] view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. public class MainActivity extends Activity {  
  2.     private Button sendBroad;  
  3.     @Override  
  4.     protected void onCreate(Bundle savedInstanceState) {  
  5.         super.onCreate(savedInstanceState);  
  6.         setContentView(R.layout.activity_main);  
  7.         sendBroad = (Button)findViewById(R.id.sendBroad);  
  8.         sendBroad.setOnClickListener(new OnClickListener() {  
  9.               
  10.             @Override  
  11.             public void onClick(View v) {  
  12.                 // TODO 自动生成的方法存根  
  13.               
  14.                 ThirdReceiver receiver = new ThirdReceiver();  //静态注册ThirdReceiver  
  15.                 IntentFilter filter = new IntentFilter();  
  16.                 filter.addAction("com.example.lios");  
  17.                 filter.setPriority(150);  
  18.                 registerReceiver(receiver, filter);  
  19.                   
  20.                 Intent intent = new Intent();  
  21.                 intent.setAction("com.example.lios");  
  22.                 intent.putExtra("MSG","我是广播");  
  23.                             sendBroadcast(intent); //sendOrderedBroadcast(intent,null)发送有序广播  
[java] view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1.             }  
  2.         });  
  3.     }  
  4.     public class ThirdReceiver extends BroadcastReceiver{  
  5.         @Override  
  6.         public void onReceive(Context context, Intent intent) {  
  7.             // TODO 自动生成的方法存      
  8.             Toast.makeText(context,"接受到的Intent的Action为:" + intent.getAction()+"广播内容是:"+intent.getStringExtra("MSG")+"ThirdReceiver",Toast.LENGTH_SHORT).show();  
  9.         }  
  10.   
  11.     }  
  12.   
  13. }  
看下效果:



大家可以发现,上面我没有发送有序广播,但是三个广播注册时都设置了优先级,所以会按照优先级的大小依次传播。如果不设置优先级的话,实际(不是逻辑上)传播顺序优先级是:动态注册 >静态注册,静态注册中的广播是按照排在前面的广播先接受,以上是实验中得出的,如果有误,麻烦指正。

上面是发送一条带有信息的Intent,action为"com.example.lios"的广播,只要注册的广播接收器且action匹配的会接受Intent中的信息。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29876893/viewspace-2078951/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/29876893/viewspace-2078951/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值