Android Service詳解(一)---概述

Android Service詳解(一)---概述和StartService

此篇文章只是對Service的一些概念分類進行了介紹
一、什麼是Service
Service 是一個可以在後臺執行長時間運行操作而不提供用戶界面的應用組件。服務可由其他應用組件啓動,而且即使用戶切換到其他應用,服務仍將在後臺繼續運行。 此外,組件可以綁定到服務,以與之進行交互,甚至是執行進程間通信 (IPC)。 例如,服務可以處理網絡事務、播放音樂,執行文件 I/O 或與內容提供程序交互,而所有這一切均可在後臺進行。

二、那麼服務可以做什麼呢?
Service可以在很多場合的應用中使用,比如播放多媒體的時候用戶啓動了其他Activity,這個時候程序要在後臺繼續播放;比如檢測SD卡上文件的變化;再或者在後臺記錄用戶的地理信息位置的改變;或者啓動一個服務來運行並一直監聽某種動作等等。

三、Service概念的總結:
Service在後臺運行,不可以與用戶直接交互;
一個服務不是一個單獨的進程。服務對象本身並不意味着它是在自己的進程中運行,除非另有規定,否則它與運行程序是同在一個進程中;
一個服務不是一個單獨的線程。Service和其他組件一樣,默認情況下,Service中的所有代碼都是運行在主線程中
Service存在的價值雖然不如Activity那麼清晰。但是一般都讓Service執行耗時較長的操作。例如:播放音樂、下載文件、上傳文件等等。但是因爲Service默認運行在主線程中,因此不能直接用它來做耗時的請求或者動作,最好在Service中啓動新線程來運行耗時的任務;
需要通過某一個Activity或其他Context對象來啓動Service。context.startService() 或 context.bindService();
Service很大程度上充當了應用程序後臺線程管理器的角色。(如果Activity中新開啓一個線程,當該Acitivyt關閉後,該線程依然在工作,但是與開啓它的Activity失去聯繫。也就是說此時的這個線程處於失去管理的狀態。但是使用Service,則可以對後臺運行的線程有效地管理。)

四、服務的分類
1.按照使用範圍分類:
(1)遠程服務(Remote Sercie):用於android系統內部的應用程序之間
功能:可被其他應用程序複用,比如天氣預報服務,其他應用程序不需要再寫這樣的服務,調用已有的即可。
(2)本地服務(Local Service):用於應用程序內部
功能:用於實現應用程序自己的一些耗時任務,比如查詢升級信息,並不佔用應用程序比如Activity所屬線程,而是單開線程後臺執行,這樣用戶體驗比較好。
那麼他們之間的區別和各自的優點是什麼

2.按照運行類別分類
(1)前臺服務
前臺服務需要調用 startForeground ( android 2.0 及其以後版本 )或 setForeground (android 2.0 以前的版本)使服務成爲 前臺服務。
使用前臺服務可以避免服務在後臺運行的時候被系統KILL。
(2)後臺服務
後臺服務就是處於後臺運行的,大多數的Service都是後臺不可見的。

➷➷➷➷最重要的是這個
3.按照 使用方式分類
(1)startService 啓動的服務
關於StartService的具體實現寫在這篇博客中了Android Service詳解(二)---StartService
當應用組件(如 Activity)通過調用 startService() 啓動服務時,服務即處於“啓動”狀態。一旦啓動,服務即可在後臺無限期運行,即使啓動服務的組件已被銷燬也不受影響。 已啓動的服務通常是執行單一操作,而且不會將結果返回給調用方。例如,它可能通過網絡下載或上傳文件。 操作完成後,服務會自行停止運行。
(2)bindService 啓動的服務
當應用組件通過調用 bindService() 綁定到服務時,服務即處於“綁定”狀態。綁定服務提供了一個客戶端-服務器接口,允許組件與服務進行交互、發送請求、獲取結果,甚至是利用進程間通信 (IPC) 跨進程執行這些操作。 僅當與另一個應用組件綁定時,綁定服務纔會運行。 多個組件可以同時綁定到該服務,但全部取消綁定後,該服務即會被銷燬。
(3)startService 同時也 bindService 啓動的服務
服務可以同時以這兩種方式運行,也就是說,它既可以是啓動服務(以無限期運行),也允許綁定。問題只是在是否實現了一組回調方法:onStartCommand()(允許組件啓動服務)和 onBind()(允許綁定服務)。
無論應用是處於啓動狀態還是綁定狀態,抑或處於啓動並且綁定狀態,任何應用組件均可像使用 Activity 那樣通過調用 Intent 來使用服務(即使此服務來自另一應用)。 不過,可以通過清單文件將服務聲明爲私有服務,並阻止其他應用訪問。

詳細說明
1.StartService的生命週期:
onCreate():創建服務
onStartCommand():服務開始運行(在2.0以前版本中,使用onStart()回調方法)
onDestroy() :服務被停止
【詳細說明:】
在程序中調用:context.startService() 會觸發執行Service生命週期中的onCreate()、onStartCommand()回調方法,此時服務就開始正式運行;
如果Service還沒有運行,則android先調用onCreate()然後調用onStartCommand();如果Service已經運行,則只調用onStartCommand(),所以一個Service的onStartC ommand方法可能會重複調用多次;
如果在程序中調用:context.stopService()會觸發執行Service生命週期中的onDestroy()回調方法,會讓服務停止;
stopService()的時候直接onDestroy,如果是調用者自己直接退出而沒有調用stopService()的話,Service會一直在後臺運行。該Service的調用者再啓動該Service後可 以通過stopService關閉Service;stopSelf()
所以StartService的生命週期爲:onCreate --> onStartCommand(可多次調用) --> onDestroy。
2.Bound Service的生命週期:
onCreate():創建服務
onBind():綁定服務,服務開始運行
onUnbind():取消綁定
onDestroy() :服務被停止
【詳細說明:】
在程序中調用:context.bindService()會觸發執行Service生命週期中的onCreate()、onBind()回調方法,此時服務開始運行;
onBind將返回給客戶端一個IBind接口實例,IBind允許客戶端回調服務的方法,比如得到Service運行的狀態或其他操作。此後調用者(Context,例如Activity)會和Service綁定在一起;
如果調用Service的調用者Context退出了,那麼會依次調用Service生命週期中的onUnbind()、onDestroy()回調方法,會讓服務停止;    
所以BindService的生命週期爲:onCreate --> onBind(只一次,不可多次綁定) --> onUnbind --> onDestory。








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章