Service是Android中四大組件之一,在Android開發中起到很是重要的做用,它運行在後臺,不與用戶進行交互。java
一、Service的繼承關係:android
java.lang.Object → android.content.Context → android.content.ContextWrapper → android.app.Service網絡
二、Sevice定義:app
Service(服務)是一個沒有用戶界面的在後臺運行執行耗時操做的應用組件。其餘應用組件可以啓動Service,而且當用戶切換到另外的應用場景,Service將持續在後臺運行。另外,一個組件可以綁定到一個service與之交互(IPC機制),例如,一個service可能會處理網絡操做,播放音樂,操做文件I/O或者與內容提供者(content provider)交互,全部這些活動都是在後臺進行。異步
三、Service有兩種狀態," 啓動的 " 和 " 綁定 ":ide
[1]經過startService()啓動的服務處於" 啓動的 "狀態,一旦啓動,service就在後臺運行,即便啓動它的應用組件已經被銷燬了。一般started狀態的service執行的任務而且不返回任何結果給啓動者。好比當下載或上傳一個文件,當這項操做完成時,service應該中止它自己。函數
[2]" 綁定 "狀態:經過調用bindService()來啓動,一個綁定的service提供一個容許組件與service交互的接口,能夠發送請求、獲取返回結果,還能夠經過誇進程通訊來交互(IPC)。綁定的service只有當應用組件綁定後才能運行,多個組件能夠綁定一個service,當調用unbind()方法時,這個service就會被銷燬了。this
注意:默認狀況下,service與activity同樣都存在與當前進程的主線程中,因此,一些阻塞UI的操做,好比耗時操做不能放在service裏進行,好比另外開啓一個線程來處理諸如網絡請求的耗時操做。若是在service裏進行一些耗CPU和耗時操做,可能會引起ANR警告,這時應用會彈出是強制關閉仍是等待的對話框。因此,對service的理解就是和activity平級的,只不過是看不見的,在後臺運行的一個組件,這也是爲何和activity同被說爲Android的基本組件。啓動後的Service具備較高的優先級,通常狀況下,系統會保證Service的正常運行,只有當前臺的Activity正常運行的資源被Service佔用的狀況下,系統纔會中止Service;當系統從新得到資源後,會根據程序的設置來決定是否從新啓動原來的Service。spa
四、Service的生命週期:線程
注意:bind service的不一樣之處在於當綁定的組件銷燬後,對應的service也就被kill了。
service生命週期也涉及一些回調方法,這些方法都不用調用父類方法,具體以下:
public class ExampleService extends Service { int mStartMode; // indicates how to behave if the service is killed IBinder mBinder; // interface for clients that bind boolean mAllowRebind; // indicates whether onRebind should be used @Override public void onCreate() { // The service is being created } @Override public int onStartCommand(Intent intent, int flags, int startId) { // The service is starting, due to a call to startService() return mStartMode; } @Override public IBinder onBind(Intent intent) { // A client is binding to the service with bindService() return mBinder; } @Override public boolean onUnbind(Intent intent) { // All clients have unbound with unbindService() return mAllowRebind; } @Override public void onRebind(Intent intent) { // A client is binding to the service with bindService(), // after onUnbind() has already been called } @Override public void onDestroy() { // The service is no longer used and is being destroyed } }
五、Service的一個子類:IntentService
IntentService使用隊列的方式將請求的Intent加入隊列,而後開啓一個worker thread(線程)來處理隊列中的Intent,對於異步的startService請求,IntentService會處理完成一個以後再處理第二個,每個請求都會在一個單獨的worker thread中處理,不會阻塞應用程序的主線程,所以,這裏提供一個思路,若是有耗時的操做與其在Service裏面開啓新線程還不如使用IntentService來處理耗時操做。而在通常的繼承Service裏面若是要進行耗時操做就必須另開線程,可是使用IntentService就能夠直接在裏面進行耗時操做,由於默認實現了一個worker thread。
實現實例:
public class defaultIntentService extends IntentService { //必須有構造函數, 而且必須帶有worker thread的name做爲參數調用super IntentService(String) public defaultIntentService() { super("defaultIntentService"); } //經過從默認worker thread調用此帶有intent的方法啓動service //當方法返回IntentService會適時中止service
@Override protected void onHandleIntent(Intent intent) { // 一般咱們會作一些好比下載文件等的工做. // 好比實例中,睡眠五秒. long endTime = System.currentTimeMillis() + 5*1000; while (System.currentTimeMillis() < endTime) { synchronized (this) { try { wait(endTime - System.currentTimeMillis()); } catch (Exception e) { } } } } }
六、中止Service
[1]若是service是非綁定的,最終當任務完成時,爲了節省系統資源,必定要中止service,能夠經過stopSelf()來中止,也能夠在其餘組件中經過stopService()來中止;
[2]綁定的service能夠經過onUnBind()來中止service。