最近做Android IM系统常常需要利用后台程序刷新前台界面,我们知道后台程序Service是没有界面的,Service是无法调用前台的空间的,那么我们该如何刷新前台的界面的?我参考了以下的两篇,《android之旅——广播(broadcast) 》、《Android的UI设计与后台线程交互 》两篇博文,并且写了相关的Demo。以下是我的以下总结。
Broadcast的作用:
(1)实现了不同的程序之间的数据传输与共享,因为只要是和发送广播的action相同的接受者都能接受这个广播。
(2)起到了一个通知的作用,比如在service中要通知主程序,更新主程序的UI等。
(3)Broadcast用Intent 传递数据。
Broadcast的实现:
在此之前,先说一下广播是如何过滤的?Acitvity 是如何接受广播的?
我们知道广播有两种注册方式,第一种,静态的注册,要在Androidmainfes.xml种配置相关的属性;第二种直接在Activity 中动态绑定广播。当有广播发送时,广播其实上传送Intent数据,系统根据<intent-filter>标签的相关内容或者动态的IntentFilter过滤,当Intent数据符合Activity时才执行OnReceive相关操作。
关于Broadcast的具体实现大家可以看
《android之旅——广播(broadcast) (http://www.cnblogs.com/qianlifeng/archive/2011/03/06/1972305.html),这篇博文的作者写的非常的清楚,我就不献丑赘述了。
下面我来简单谈谈后台界面如何刷新前台界面的,其实就是Service与Broadcast的简单结合。
Broadcast如果是静态注册,那么Broadcast文件只能是独立的显然不是我们想要的,说要用Service更新前台Activity界面,我们一般用动态注册广播,在Activity内部注册一个广播再写一个内部类继承BroadcastReceive出来Intent传来的广播事件。这里说一下动态注册广播是要注意要在Activity生命周期结束的时候解除广播的注册。具体可以查看http://mobile.51cto.com/android-230195.htm。
在主程序activity中注册一个BroadcastReceiver,用于接收Service发布的广播。
unregisterReceiver(dataReceiver);//取消注册Broadcast Receiver
推荐一篇博文:
《Android 中的BroadCastReceiver 》http://yangguangfu.iteye.com/blog/1063732
本文参考资料:
(1)http://www.cnblogs.com/qianlifeng/archive/2011/03/06/1972305.html
(2)http://blog.csdn.net/yonghumingshishenme/archive/2011/03/23/6271950.aspx
(3)http://mobile.51cto.com/android-230195.htm