Android Broadcast Receiver

一、广播机制

BroadCast(广播)一种是系统与进程,进程与进程之间通信的方式。

广播的类型有两种,普通广播(Normal broadcasts)和有序广播(Ordered broadcasts)。

普通广播是异步执行的,广播发出后,所有的Broadcast Receiver会时接收到这条广播消息。

Intent intent = new Intent("android.intent.action.MY_BROADCAST");  
sendBroadcast(intent); 

有序广播是同步执行的,广播发出后,同一时刻只会有一个Broadcast Receiver能接收到这条广播消息,优先级高的Broadcast Receiver先接收广播消息,并且前面Broadcast Receiver可以截断正在传递的广播。

Intent intent = new Intent("android.intent.action.MY_BROADCAST");  
sendOrderedBroadcast(intent,null); 

通过在AndroidManifest.xml中的<receiver>标签下的<intent-filter android:priority="" >设置优先级。

通过abortBroadcast()将广播截断。

二、Broadcast Receiver

Broadcast Receiver用于接收系统或者其他进程的的系统广播,也可以接收本地广播。

onReceiver()方法中不应该添加过多的逻辑或者进行任何耗时的操作,因为BroadcastReceiver是不允许开启线程的,当onReceiver()方法运行了较长的时间而没有结束时,程序就会报错,因此,Broadcast Receiver更多是扮演一种打开程序其他组件的角色。

class MyReceiver extends BroadcastReceiver{
     @Override
     public void onReceiver(Context context,Intent intent){
}
}

注册Broadcast Receiver方式有两种,动态注册和静态注册。

1.动态注册

  MyReceiver receiver = new MyReceiver();
  IntentFilter filter = new IntentFilter();
  filter.addAction("android.intent.action.MY_BROADCAST");
  registerReceiver(receiver, filter);

动态注册的广播接收器一定都要取消注册才行,在 onDestroy() 方法中通过调用 unregisterReceiver()方法来实现的。 

 protected void onDestroy() 
 {super.onDestroy();
  unregisterReceiver(MyReceiver);
 } 

2.静态注册

静态注册的BroadReceiver一定要在AndroidManifest,xml中注册才可以使用。

<receiver android:name=".MyReceiver">  
    <intent-filter>  
        <action android:name="android.intent.action.MY_BROADCAST"/>   
    </intent-filter>  
</receiver>  


以上发送和接受的都是系统全局广播,即发出的广播可以被其他任何应用程序接收到,并且我们也可以接收来自其他任何应用程序的广播,这样很容易引起安全性问题。因此,Android引入了一套本地广播机制,使用这个机制发出的广播只能够在应用程序的内部进行传递,广播接收器也只能接受来自本地应用程序发出的广播。

1.创建LocalBroadcastManager实例

LocalBroadcastManager localBroadcastManager=LocalBroadcastManager.getInstance(this);
2.发送本地广播
Intent intent = new Intent("com.example.broadcasttest. LOCAL_BROADCAST"); 
localBroadcastManager.sendBroadcast(intent); 
3.动态注册本地Broadcast Receiver
intentFilter = new IntentFilter();
intentFilter.addAction("com.example.broadcasttest.LOCAL_BROADCAST");
localReceiver = new LocalReceiver();
localBroadcastManager.registerReceiver(localReceiver, intentFilter); 
另外,本地广播是没有静态注册的,因为必须启动了程序才有本地这个概念。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值