service的主要功能如下:
a. 執行需要長時間啟動並執行操作,這個操作不與使用者進行互動,如網路下載、大檔案I/O、複雜計算。 b. 應用內或應用間資料通訊,Android每個應用程式都在自己的dalvik虛擬機器中運行,一個應用是不允許訪問其他應用的記憶體資訊的,為此 Android引入了Content Provider在不同應用間共用資料,BroadcastReceiver廣播資訊給不同應用程式,但Content Provider更多用於資料的共用,BroadcastReceiver廣播的資訊會被所有應用接收較耗費系統資源,對於兩個應用間動態進行互動還需要通過Service來完成。 首先,service的用途可分為:1、單個運用程式內的服務2、多個應用程式內的服務及通訊(注意:是多個應用程式內哦)‘ 1、單個應用程式內的服務。分兩種情況討論: 1)、在Activity中調用startService(最普遍的使用方法),這種service無法與外界互動,即不能擷取到service的相關屬性與相關操作。Service樣本 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是重新開一個線程來處理需要完成的任務。 生命週期:通過startService啟動服務,若服務未啟動,會先執行onCreate函數(若服務已啟動則不執行此函數),再執行onStartCommand函數。由此可知多次調用startService傳入相同參數不會啟動多個服務 (onStartCommand函數會執行多次),所以最終只需要調用一次stopService或stopSelf函數停止服務;我們可以將 service的處理邏輯放入onStartCommand函數中。服務一直運行,在程式退出後服務也不會停止,直到stopService或 stopSelf函數被調用,當然可能被系統回收。 對於onStartCommand的傳回值,若返回START_STICKY表示服務通過顯式調用啟動或停止,若返回 START_NOT_STICKY orSTART_REDELIVER_INTENT表示服務僅在有請求發送過來處理時才處於運行狀態。 使用情境:因為這種方式Service無法與外部進行方便的動態互動,所以適合做後台服務,如網路下載(使用者通過Intent傳入Url到Service,推薦使用IntentService). 2)、通過多bindService啟動Service(動態互動的Service) 如果當個應用程式內有多個線程要與Service通訊時,我們可以使用bindService。使用這種方法,我們可以對Service內的屬性進行操作和訪問。 使用情境:應用內通訊,如音樂播放器,在服務中控制播放器的播放、暫停、停止,在Activity中通過對服務作業控制播放器。 2、應用間進行通訊(這是不同應用間進行通訊哦) 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