最近做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。
註冊BroadcastReceiver
在主程式activity中註冊一個BroadcastReceiver,用於接收Service發布的廣播。
- @Override
- protected void onStart() {//重寫onStart方法
- dataReceiver = new DataReceiver();
- IntentFilter filter = new IntentFilter();//建立IntentFilter對象
- filter.addAction("com.justel.serviceBC");
- registerReceiver(dataReceiver, filter);//註冊Broadcast Receiver
- super.onStart();
- }
撤銷BroadcastReceiver
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