Android中的BroadcastReceiver注册方式研究

2015-05-29 12:07鲁晓天李永全
电脑知识与技术 2015年10期
关键词:接收器生命周期应用程序

鲁晓天+李永全

摘要:在Android整个系统中,Broadcast作为一种机制,在应用程序之间传输信息。而BroadcastReceiver 就是对发送出来的Broadcast进行过滤接受并响应的一类组件,也叫作广播接收器,是Android的四大基本组件之一。不过目前对BroadcastReceiver进行的介绍不是很多,通过对广播接收器的生命周期,广播类型,注册方式等方面进行介绍,并通过两个实例使读者对广播接收器的注册方式有进一步的了解,对两种注册方式有更直面的认识,明白动态注册和静态注册之间的差异和优缺点,对两种基本的注册方法的使用流程更加清晰。

关键词:Android;BroadcastReceiver;注册方式;生命周期;广播

中图分类号:TN87 文献标识码:A 文章编号:1009-3044(2015)10-0041-02

Android系统共有4个基本组件,它们是Activity,Service服务,Content Provider内容提供者,BroadcastReceiver即广播接收器。对于广播接收器而言,虽然没有用户界面,但是它们可以响应收到的信息,或者通知用户,一般是通过启动一个activity来实现。尤其在安卓手机系统中,为了吸引用户的注意力,可以有很多种方式通知用户,比如说让手机震动,发声或者亮灯。一个手机应用可以发出通知对外部事件进行过滤和接收并做出响应。一般来说,用户获得消息,可以通过很多方式,比如点击在状态栏上显示的图标。对于整个Android系统,广播无处不在,在开机过程中,系统就会产生一条广播,如果能够接收到这条广播,手机就能进行开机启动服务。

1 BroadcastReceiver生命周期

一个广播接收器对象的生命周期往往都是从被调用的一刻开始直到调用结束。对象的调用方式一般是通过onReceive()函数来实现的,如果该函数返回值后,此次对象就变成无效的了,这就是一个完整的生命周期。

在函数调用的整个过程中,一般不允许有很费时的操作,并且不能使用线程来执行。这是因为假设同时有其他异步操作返回了结果时,这时广播接收器也许已经失效。它的生命周期一般在十秒左右,要是onReceive()里面做大于十秒的事情,就会产生错误。当广播到来的时候,会对广播接收器对象重新创建,通过onReceive()函数,执行完以后,这时候对象就会被去掉。

2 BroadcastReceiver注册方式

广播接收器的注册方式有两种,即静态注册和动态注册。对于静态注册方式的配置是在AndroidManifest.xml这样一个文件中进行的,我们首先要做的就是要在MyReceiver进行一个广播地址的注册。在地址信息配置好以后,MyReceiver就应该可以接收到信息。因此静态注册是常驻型的,当应用程序关闭或者停止后,如果还是有广播消息产生进来,MyReceiver同样会被系统调用并且会自动的运行。由此可以知道这种注册方式的特点:无论应用程序是否处于活动状态,都会对其进行监听,在手机上安装好后,不管该应用程序是处于什么状态,都会执行该监听方法中的内容。

动态注册和静态注册不同,它必须指定在代码中动态的广播地址进行注册,一般我们会在Activity中注册一个广播。因此这种注册方式不是常驻型的,如果程序的生命周期结束,广播也会跟着结束。此外动态注册广播接收器的广播会跟着Activity的状态,如果注册的Activity被关闭之后,广播也会随着失效。相反静态注册就不用考虑广播接收器是否被关闭,只要手机设备处于开启状态,并且广播接收器也是开启状态。无论用哪种方式在哪个里面注册,都要用到sendBroadcast()发送广播。用广播发送的是一个Intent,而Intent里面则是一个action。采用动态注册在代码里面进行,注册一般用到onResume()。如果是静态方式,在xml文件中注册也是可行的。

3广播的收发

顾名思义,广播的收发就两个过程,接收和发送。在发送过程中,第一步广播在需要发送信息的位置,将需要发送的和过滤的信息放进一个Intent对象中,第二步就是调用Context.sendBroadcast()函数的方法,来把Intent对象通过广播发送出去。Intent对象发出去之后,只要是满足条件的广播接收器都会随机地执行onReceive()函数。一般而言广播都是系统自身发起的,比如来电来信、信号的异常、地域的变换、电量报警等。当然程序也可以自身播放一个广播。并且程序用于响应重要通知的BroadcastReceivers,它的数量是不固定的。这样广播通过多种方式通知用户,比如振动设备、开启闪光灯、播放音效等。为了方便直观,大都采用在状态栏产生一个特定的图标,使用者就可以点开它来查看通知的具体内容。如果一个广播消息被监听到时,Android就会调用它,并且将包含此消息的Intent对象传给它。在onReceive中执行代码的时间最好不要超过5秒。Receiver只在onReceive被执行的时候是激活状态,一旦返回,Receiver就不再是激活状态了。

4 BroadcastReceiver示例演示

在Android系统中广播的样式各种各样,例如电池电量的状态,短信接收发送和电话的接收状态都会产生一个广播,应用程序的开发就是对这些广播状态进行监听,而且还对程序逻辑做出相应的处理。为了使读者能更好理解广播接收器注册方式 ,作者通过两个简单的例子进行说明。这两个例子很简单,一个是接收短信,利用的是静态注册的广播(常驻广播)。另一个是电量监控,利用的是动态注册广播。

4.1接收短信

接收短信在AndroidManifest.xml里面的application来定义receiver并设置成接收状态的。当需要发送能够跨线程、跨进程的广播时,就可以使用广播接收器了。它接受的对象是Intent,对象可以携带Action,也可以携带数据等。每一个广播接收器都需要建立一个Intent-filter,不然就无法过滤不想收到的对象。而当某个线程想发一个广播给某个广播接收器时,发送的Action必须符合该广播接收器的Intent-filter的Action,不然无法接收。

系统注册在AndroidManifest.xml中的程序如下:

< receiver android:name = ".MyBroadcastReceiver" >

< intent-filter android:priority = "1000" >

< action android:name = " android.provider.Telephony.SMS_RECEIVED" />

需要权限 :

< uses-permission android:name = "android.permission.RECEIVE_SMS" />

< uses-permission android:name = "android.permission.SEND_SMS" />

部分实现功能程序如下:

System.out.println("短信接收器监听: " + intent.getAction());

...

phoneNum = currentMessage.getDisplayOriginatingAddress();// 来讯者的电话号码

SMScontent = currentMessage.getDisplayMessageBody(); // 短信内容

}

Toast.makeText(arg0, "接收到(" + phoneNum + ")的短信:+\n" + SMScontent, Toast.LENGTH_SHORT).show();

4.2电量监控

一般而言,当我们想查看电池使用状态时,都是查看当前的电量,而不是观察电量变化的广播,这样为了立即显示出当前电池电量。我们可以按以下方式实现:

在以上程序中可以看到有两个参数,第一个参数为广播接收者。它可以是系统自身的,也可以是通过定义的;另一个参数为意图过滤器。我们在创建完广播接收器之后,需要先为它注册一个指定的广播地址,才能使它进入工作状态。

在代码中注册程序,利用IntentFilter对象来过滤掉那些无法响应和处理的Intent对象,这样可以只将自己需要的Intent对象接收进来进行处理。IntentFilter只列出组件愿意接受的对象,但它只会对隐式对象进行过滤,而显式对象会直接被传送到目标组件中去。在Android组件中,IntentFilter的数量不受限制,可以允许有多个同时存在,它们之间是相互独立,只要有一个验证通过,就全部可以工作。程序如下:

4.3 总结归纳

本文通过两个简单的示例使读者能够加深了解广播接收器的注册方式。从中可以发现:动态注册较静态注册灵活。采用静态注册一个广播接收器时,对应的广播的接收不受应用程序状态的影响。如果是采用动态注册,必须用到unregisterReceiver()这样一个函数来取消注册,否则跟静态注册的模式就是一样的。但是执行了该函数之后,就不允许再接受广播。对于有序广播消息,动态注册的广播接收器总是先于静态注册的广播接收器被触发。对于同样是动态注册的广播接收器,优先级别高的将先被触发,而静态注册的广播接收器总是按照静态注册的顺序执行。由此在注册方法的选择上,还是推荐使用静态注册方式,通过系统来管理receiver,并且程序所有的receiver,都可以在xml里面看到。相反动态注册方式,receiver隐藏在代码中,难以查找发现,不便于程序的调试。

参考文献:

[1] 曾健平. 邵艳洁. Android系统架构及应用程序开发研究[J]. 微计算机信息, 2011(9): 1-3.

[2] 关晶鑫, 李永全. 基于Android的手机购物终端系统设计[J]. 电子世界, 2013(2): 2713-2717.

[3] 胡伟. Android系统架构及其驱动研究[J]. 广州广播电视大学学报, 2010(4): 96-101.

[4] 李宁, 朱清昃, 王冬霞.安卓系统手机通讯录的设计与实现[J].辽宁工业大学学报, 2014(4): 212-215.

[5] 杨潇亮. 基于安卓操作系统的应用软件开发[J]. 电子制作, 2014(19): 45-46.

猜你喜欢
接收器生命周期应用程序
从生命周期视角看并购保险
删除Win10中自带的应用程序
民用飞机全生命周期KPI的研究与应用
JXG-50S型相敏轨道电路接收器自动测试台
企业生命周期及其管理
埃及
ZPW-2000A轨道电路接收器冗余电路存在问题分析及对策
IDT推出超紧凑型无线电源接收器,可节省70%板面积
三星电子将开设应用程序下载商店
微软软件商店开始接受应用程序