首发于http://blog.csdn.net/pwiling/article/details/47682413,禁止转载
之前数次在程序中碰到Android广播,总是有这个疑问:往往是在发送广播的activity里面进行动态注册,动态注册必须要获得BroadcastReceiver对象,既然我们已经获得了广播接受器的对象,为何还要发送广播,直接用广播接收器的对象调用里面的相关逻辑处理的方法,不行吗?为什么还要绕这么一大圈用广播呢?
也就是说在实例化对象,调用相关方法能够解决问题的情况下,为什么还要有Android广播机制?为什么要设计Android广播机制?存在的意义是什么?
以前都是走马观花,这次弄清楚了。在解答这个问题之前,我们首先来详细了解一下Android广播机制
什么是Android广播机制
在Android中一些操作完成后,会发送广播,如果某个程序接受到了广播,会做相应的处理。有些类似于方法调用,但又和方法调用很不同,因为方法调用,如果被调用的方法不存在的话,编译器会报错,而Android广播机制最大的特点是只管发送,不管有没有接收,也不管接收方怎么处理数据
Android广播机制的三要素
广播(Broadcast) - 用于发送广播;
广播接收器(BroadcastReceiver) - 用于接收广播;
意图内容(Intent)-用于保存广播相关信息的媒介。
下面详细介绍一下这三个要素
BroadcastReceiver
我们继承自BroadcastReceiver类,并重写onReceiver方法,这样就在我们的程序中自定义了一个广播接收器。当有广播事件产生时,Android操作系统首先告诉注册到其上面的广播接收器产生了一个怎么样的事件,每个接收器首先判断是不是我这个接收器需要的事件,如果是它所需要的事件,再调用其onReceiver方法,在这里面进行相关的逻辑处理。
BroadcastReceiver用于监听被广播事件,为了达到这个目的,BroadcastReceiver必须进行注册,注册的方法有以下两种:
静态注册
静态注册方式是在AndroidManifest.xml的application里面定义receiver并设置要接收的action。
静态注册方式的特点:不管该应用程序是否处于活动状态,都会进行监听。
<receiver android:name="MyReceiver">
<intent-filter>
<action android:name="MyReceiver_Action"/>
</intent-filter>
</receiver>
其中,MyReceiver为继承BroadcastReceiver的类,重写了onReceiver方法,并在onReceiver方法中对广播进行处理。标签设置过滤器,接收指定action广播。
动态注册
动态注册方式在activity里面调用函数来注册。一个形参是receiver,另一个是IntentFilter,其中里面是要接收的action。
动态注册方式特点:在代码中进行注册后,当应用程序关闭后,就不再进行监听。
MyReceiver receiver = new MyReceiver();
//创建过滤器,并指定action,使之用于接收同action的广播
IntentFilter filter = new IntentFilter("MyReceiver_Action");
//注册广播接收器
registerReceiver(receiver, filter);
就是在这里产生了疑问:往往是在发送广播的activity里面进行动态注册,动态注册必须要获得BroadcastReceiver对象,既然我们已经获得了广播接受器的对象,为何还要发送广播,直接用广播接收器的对象调用里面的相关逻辑处理的方法,不行吗?为什么还要绕这么一大圈用广播呢?
动态注册还要在发送完广播后,注销BroadcastReceiver
unregisterReceiver(receiver);
Intent
Intent intent = new Intent("MyReceiver_Action");
// 可通过Intent携带消息
intent.putExtra("msg", "发送广播");
Intent一般包括两方面的内容,指定的action和携带的相关信息。action就想当于一封信的地址,Android系统只用知道了这个“地址”,才能把“信”送到广播接收器中。intent携带的信息就是我们想要发送的内容。
发送广播
sendBroadcast(intent);
好,介绍完了Android广播机制,我们来解决开头的问题。
事实上,Android广播机制是为了解决 跨进程通讯。而这一点是直接调用方法所不能实现的。因为,有些情况下,比如电量变化,可能有很多应用要根据这个改变来作出相应,而在最初设计时,你是不可能知道所有这些应用的,也就无法一一实例化对象,不能直接调用方法,这时广播机制的作用就体现出来了。
由于android系统中应用程序之间不能共享内存。因此,在不同应用程序之间交互数据(跨进程通讯)就稍微麻烦一些。Android广播有两种类型,一种是程序内的,一种程序间的。程序内的广播体现不出其真正意义,比如,通知时区改变、电池电量低、拍摄了一张照片或者用户改变了语言选项,这些才是广播真正的用途。Android广播一般用于一个程序告诉另一个程序,某些信息改变了,发生变化了,需要作出相关的应对,并不管有哪些程序接收到这些信息。
如果这篇博客解答了你的一些疑惑,点个顶吧!