最近做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) (),这篇博文的作者写的非常的清楚,我就不献丑赘述了。

下面我来简单谈谈后台界面如何刷新前台界面的,其实就是Service与Broadcast的简单结合。

Broadcast如果是静态注册,那么Broadcast文件只能是独立的显然不是我们想要的,说要用Service更新前台Activity界面,我们一般用动态注册广播,在Activity内部注册一个广播再写一个内部类继承BroadcastReceive出来Intent传来的广播事件。这里说一下动态注册广播是要注意要在Activity生命周期结束的时候解除广播的注册。具体可以查看http://mobile.51cto.com/android-230195.htm

注册BroadcastReceiver

在主程序activity中注册一个BroadcastReceiver,用于接收Service发布的广播。


1. @Override
2. protected void onStart() {//重写onStart方法 
3. new
4. new IntentFilter();//创建IntentFilter对象 
5. "com.justel.serviceBC");  
6. //注册Broadcast Receiver 
7. super.onStart();  
8. }

撤销BroadcastReceiver

 unregisterReceiver(dataReceiver);//取消注册Broadcast Receiver

 

推荐一篇博文:

《Android 中的BroadCastReceiver 》http://yangguangfu.iteye.com/blog/1063732

 

本文参考资料:


(3)http://mobile.51cto.com/android-230195.htm