一個服務就是一個能夠在後台執行長時操作的應用程式組件,並且不提供使用者介面。一個應用程式組件能夠啟動一個服務,即使使用者切換到另一個應用程式,這個服務也會繼續在後台運行。另外,一個組件能夠綁定一個跟它互動的服務,甚至是處理序間通訊(IPC)。例如,一個服務可以處理網路事務、播放音樂、執行檔案I/O、或者跟內容提供器互動,所有這些都是在後台完成的。
一個Service基本上有兩種形式:
被啟動(Started)
當應用程式組件(如一個Activity)通過調用startService()方法啟動的服務是“被啟動(started)”的。服務一旦啟動,它就能夠無限期的在後台運行,即使啟動它的組件被銷毀。通常,一個被啟動的服務之星一個單一操作,並且不給調用者返回結果。例如,這個服務可能在網路上下載或上傳檔案。當操作完成的時候,服務應該自己終止。
被綁定(Bound)
當一個應用程式組件通過調用bindService()方法綁定的服務是“被綁定(bound)”的。一個被綁定的服務會提供一個允許組件跟服務互動的用戶端介面,用於發送請求、擷取結果、甚至是跨進程的處理序間通訊(IPC)。一個被綁定的服務的已耗用時間跟綁定它的應用程式組件一樣長。多個組件能夠綁定一個服務,但是只有所有這些綁定解除綁定,這個服務才被銷毀。
儘管這份文檔分開討論服務的這兩種方式,但是你的服務能夠用這兩種方式工作---它能夠被啟動(無限期的運行),也允許綁定。這取決你是否實現了一對回調方法:運行組件啟動的onStartCommand()方法和允許綁定的onBind()方法。
無論你的應用程式是啟動、綁定或同時使用這兩種方式開啟一個服務,任何應用程式組件都能使用這個服務(即使是單獨的應用程式),用同樣的方法,任何組件能夠使用一個Activity---通過Intent啟動Activity。但是,你能夠在資訊清單檔中聲明私人的服務,並且阻止來自其他應用程式的訪問。
警告:一個服務運行在它的宿主進程的主線程中---這個服務不建立它自己的線程,並且不在一個單獨的進程中運行(除非你指定)。這就意味著如果你的服務要做一些頻繁的CPU工作或阻塞操作操作(如MP3的回放或網路操作),你應該在這個服務中建立一個新的線程來做這項工作。通過使用一個單獨的線程,你會減少應用程式不響應(ANR)的錯誤風險,並且應用程式的主線程能夠保留給使用者,專用於跟Activity的互動。