1.2 Broadcast

  在Android中,Broadcast是一种广泛运用的在应用程序之间传输信息的机制。而BroadcastReceiver是对发送出来的 Broadcast进行过滤接受并响应的一类组件。

  一个BroadcastReceiver 对象只有在被调用onReceive(Context, Intent)的才有效的,当从该函数返回后,该对象就无效的了,结束生命周期。因此从这个特征可以看出,在所调用的onReceive(Context, Intent)函数里,不能有过于耗时的操作。对于耗时的操作,请start service来完成。因为当得到其他异步操作所返回的结果时,BroadcastReceiver 可能已经无效了。

  首先在需要发送信息的地方,把要发送的信息和用于过滤的信息(如Action、Category)装入一个Intent对象,然后通过调用 Context.sendBroadcast()、sendOrderBroadcast()或sendStickyBroadcast()方法,把 Intent对象以广播方式发送出去。当Intent发送以后,所有已经注册的BroadcastReceiver会检查注册时的IntentFilter是否与发送的Intent相匹配,若匹配则就会调用BroadcastReceiver的onReceive()方法。所以当我们定义一个BroadcastReceiver的时候,都需要实现onReceive()方法。

  广播分为静态注册和动态注册:静态的在AndroidManifest.xml中用<receiver>标签生命注册,并在标签内用<intent-filter>标签设置过滤器。动态的在代码中先定义并设置好一个 IntentFilter 对象,然后在需要注册的地方调Context.registerReceiver()方法,如果取消时就调用 Context.unregisterReceiver()方法。如果用动态方式注册的BroadcastReceiver的Context对象被销毁时,BroadcastReceiver也就自动取消注册了。

静态注册,Manifest

<receiver android:name="clsReceiver2">

<intent-filter>

<action android:name="com.testBroadcastReceiver.Internal_2"/>

<action android:name="android.intent.action.BOOT_COMPLETED" />  //开机启动广播

</intent-filter>

</receiver>

动态注册,使用组件中:  /* 一般:在onStart中注册,onStop中取消unregisterReceiver */

IntentFilter intentFilter = new IntentFilter();

intentFilter.addAction(action); //为BroadcastReceiver指定action,即要监听的消息名字。

registerReceiver(MyBroadcastReceiver,intentFilter); //注册监听

Intent i=new Intent().setAction(action).putExtra(“Key”,”Value”);

sendBroadCast(i);

unregisterReceiver(MyBroadcastReceiver);   //取消监听

private class MyBroadcastReceive extends BroadcastReceiver{

public void onReceive(Context context, Intent intent){

String action = intent.getAction();

if(intent.ACTION_BATTERY_CHANGED.equals(action)) {/* 根据action处理内容 */}

}

}

另:有序广播(Ordered Broadcast):

优点是按优先级的不同(<intent-filter android:priority="200">),优先Receiver可对数据进行处理,并传给下一个Receiver;通过abortBroadcast可终止广播的传播。缺点是效率低

  二,发送广播的方法:sendOrderedBroadcast()

  三,优先接收到Broadcast的Receiver可通过setResultExtras(Bundle)方法将处理结果存入Broadcast中,

  下一个Receiver 通过 Bundle bundle = getResultExtras(true)方法获取上一个 Receiver传来的数据

另:滞留广播(Sticky Broadcast)

sendStickyBroadcastsendStickyOrderedBroadcast发出的广播会一直滞留,以便有人注册这则广播消息后能尽快的收到这条广播,即sendStickyBroadcast会保留最后一条广播,并且一直保留下去,这样即使已经处理了这条广播但当再一次注册这条广播后依然可以收到它,如果你只想处理一遍,可以用removeStickyBroadcast。其他功能与sendBroadcast相同,但是使用sendStickyBroadcast 发送广播需要获得BROADCAST_STICKY permission

Android引入广播机制的用意?

A:从MVC的角度考虑(应用程序内) Android的四大组件本质上就是为了实现移动设备上的MVC架构,它们之间有时候是一种相互依存的关系,有时候又是一种补充关系,引入广播机制可以方便几大组件的信息和数据交互

B:程序间互通消息(例如在自己的应用程序内监听系统来电)

C:效率上(参考UDP的广播协议在局域网的方便性)

D:设计模式上(反转控制的一种应用,类似监听者模式)

上一篇:[翻译] 如何在 ASP.Net Core 中使用 Consul 来存储配置


下一篇:如何在 ASP.Net Core 中使用 Serilog