Android中程式與Service互動的方式——總結

lostinai發表於2013-06-03
     前文:Android中程式與Service互動的方式——綜述

                   Android中程式與Service互動的方式——互動方式

       以上兩篇文章分別介紹了與Service的五種互動方式,本文主要作為一個補充和總結。

       1. 服務型別比較

表1.1

        2. 五種互動方式比較

表2.1

        通過表1.1和表2.1我們可以知道:

        (1) 跨程式通訊

        只有Broadcast、Messenger、AIDL這三種方式支援跨程式通訊,也就是Server可以執行在獨立的程式中並與之通訊。

        (2) 易用性

        通過對比之後發現Broadcast、SharedPreferences、Interface這三種方法使用起來比較方便,也較容易掌握,而Messenger和AIDL使用起來稍微繁瑣一些,特別是AIDL。

        (3) 執行效率

        因為是模擬下載以及資料交換量較小,因此對於執行效率來說影響不大。但如果資料量較大,那麼Messenger、Interface以及AIDL的執行效率較高,而Broadcast和SharedPreferences的效率相對較低。系統會優先處理系統的Broadcast,如果此時正好發出我們的Broadcast,那麼接收會有延遲。對於SharedPreferences來說,檔案操作如果涉及道德資料吞吐量較大,那麼延遲會較高,穩定性也狠難得到保證。

        (4) 可擴充套件性

        對於Broadcast和SharedPreferences因為執行效率的原因,如果再加上擴充套件(比如傳遞大量資料),這兩種方法就會捉襟見肘。同時在BroadcastReceiver中的onReceive方法中不能處理長耗時事件,否則會出現ANR錯誤。同樣的,對於SharedPreferences方法,如果有大量的資料需要寫入檔案的話,那麼也會耗時,同樣存在操作風險。因為Messenger、Interface以及AIDL可以直接新增相應的處理方法來擴充套件,因此擴充套件性較高。

        3.  注意事項

        3.1 如果採用bindService()方法啟動Server端的話,需要通過ServiceConnection()方法來獲取Server端返回的binder物件。

        3.2 在呼叫 bindService 繫結到Service的時候,應當保證在處理完成之後呼叫unbindService解除繫結(儘管 Activity 被 finish 的時候繫結會自動解除,並且Service會自動停止)。

        3.3 使用startService啟動服務之後,一定要使用stopService停止服務,不管是否使用bindService。

        3.4 同時使用 startService 與 bindService 時要注意,Service 的終止,需要unbindService與stopService同時呼叫才能終止 Service。如果先呼叫 unbindService 此時服務不會自動終止,再呼叫stopService之後服務才會停止;如果先呼叫 stopService 此時服務也不會終止,而在呼叫 unbindService或者之前呼叫 bindService的Context不存在了(如Activity 被 finish 的時候)之後服務才會停止。

        3.5 當裝置螢幕在“橫”“豎”切換時,此時因為Activity會重新建立,因此旋轉之前的使用bindService 建立的連線便會斷開(Context 丟失了),就相當於已經解除繫結了。

相關文章