android service 的各類用法(IPC、AIDL)

最近在學android service,感受終於把service的各類使用場景和用到的技術整理得比較明白了,受益頗多,在此記錄一下!html

service的主要功能以下:java

a. 執行須要長時間運行的操做,這個操做不與用戶進行交互,如網絡下載、大文件I/O、複雜計算。android

b. 應用內或應用間數據通訊,Android每一個應用程序都在本身的dalvik虛擬機中運行,一個應用是不容許訪問其餘應用的內存信息的,爲此Android引入了Content Provider在不一樣應用間共享數據,BroadcastReceiver廣播信息給不一樣應用程序,但Content Provider更多用於數據的共享,BroadcastReceiver廣播的信息會被全部應用接收較耗費系統資源,對於兩個應用間動態的進行交互還須要經過Service來完成。安全

首先,service的用途可分爲: 一、單個運用程序內的服務 二、多個應用程序內的服務及通信(注意:是多個應用程序內哦)‘網絡

一、單個應用程序內的服務。分兩種狀況討論:多線程

1)、在Activity中調用startService(最廣泛的使用方法),這種service沒法與外界交互,即不能獲取到service的相關屬性與相關操做。 Service示例ide

<!-- lang: java -->
public class MyService extends Service {

        @Override
        public void onCreate() {
            super.onCreate();
            Toast.makeText(this, "Service Create", Toast.LENGTH_SHORT).show();
        }
    
        @Override
        public void onDestroy() {
            Toast.makeText(this, "Service Destroty", Toast.LENGTH_SHORT).show();
            super.onDestroy();
        }
    
        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            Toast.makeText(this, "Service Start", Toast.LENGTH_SHORT).show();
            return super.onStartCommand(intent, flags, startId);
        }
    }

在這種狀況下,咱們把大部分要作的工做都放在了onCreate或者onStartCommand當中。可是注意:這種service並無單獨開一個線程,仍然是主線程,因此,當在裏面進行各類耗時操做時,會出現ANR(對Activity和BroadcastReceiver響應時間的限制(Activity對事件響應不超過5秒,BroadcastReceiver執行不超過10秒))。通常耗時操做最好在service中另開一個線程。函數

因此推薦使用IntentService,IntentService是從新開一個線程來處理須要完成的任務。ui

生命週期:經過startService啓動服務,若服務未啓動,會先執行onCreate函數(若服務已啓動則不執行此函數),再執行onStartCommand函數。由此可知屢次調用startService傳入相同參數不會啓動多個服務(onStartCommand函數會執行屢次),因此最終只須要調用一次stopService或stopSelf函數中止服務;咱們能夠將service的處理邏輯放入onStartCommand函數中。服務一直運行,在程序退出後服務也不會中止,直到stopService或stopSelf函數被調用,固然可能被系統回收。this

對於onStartCommand的返回值,若返回START_STICKY表示服務經過顯式調用啓動或中止,若返回START_NOT_STICKY orSTART_REDELIVER_INTENT表示服務僅在有請求發送過來處理時才處於運行狀態。

使用場景:由於這種方式Service沒法與外部進行方便的動態交互,因此適合作後臺服務,如網絡下載(用戶經過Intent傳入Url到Service,推薦使用IntentService).

2)、經過多bindService啓動Service(動態交互的Service)

若是當個應用程序內有多個線程要與Service通信時,咱們可使用bindService。使用這種方法,咱們能夠對Service內的屬性進行操做和訪問。

使用場景:應用內通訊,如音樂播放器,在服務中控制播放器的播放、暫停、中止,在Activity中經過對服務操做控制播放器。

二、應用間進行通信(這是不一樣應用間進行通信哦)

1)、Using a Messenger:http://developer.android.com/guide/components/bound-services.html#Messenger

使用場景:當僅有2個應用要互相通信時,咱們使用Messenger類,而不使用AIDL的方式,

2)、AIDL

Android使用AIDL來完成進程間通訊(IPC),AIDL全程爲Android Interface Definition Language。在服務須要接受不一樣應用多線程的請求時才須要使用AIDL,若是是同一個應用內的請求使用Binder實現便可,見應用內交互的服務;若是隻是應用間通訊而不是多線程處理的話使用Messenger,固然這兩種狀況也可使用AIDL。本地進程和遠程進程使用AIDL有所不一樣,本地進程內調用時會都在調用的線程內執行,遠程進程使用是經過Service進程內一個由系統維護的線程池發出調用,因此多是未知線程同時調用,須要注意線程安全問題。

使用場景:當咱們有多個客戶端(應用程序)要與服務端進行通信時,即在服務須要接受不一樣應用多線程的請求時才須要使用AIDL。

全部相關代碼及例子:

http://www.cnblogs.com/trinea/archive/2012/11/08/2701390.html
http://www.cnblogs.com/trinea/archive/2012/11/08/2699856.html
相關文章
相關標籤/搜索