service生命週期

2021-06-07 14:09:33 字數 1715 閱讀 9533

service 生命週期

注意:onstart方法是在android2.0之前的平台使用的.在2.0及其之後,則需重寫onstartcommand方法,

同時,舊的onstart方法則不會再被呼叫.

1)   可以通過呼叫 context.startservice() 啟動乙個 service ,這可能會觸發 service 的 oncreate() 和 onstart() 操作,具體來說即執行 startservice() 一定會觸發 onstart() ,但如果該 service 已經在系統中存在,則 oncreate() 不會被再次呼叫,它只在 service 第一次啟動時觸發。

通過 context.startservice() 啟動的 service 會一直執行,直到通過 context.stopservice() 或者 stopself() 停止它。多次通過 startservice() 啟動某個服務並不會生成多個例項,但會導致服務的 onstart() 被多次呼叫,當然由於只有乙個例項,因此無論啟動多少次,停止它只需呼叫一次 context.stopservice() 或 stopself() 就可以了。

2)  也可以通過 context.bindservice() 來獲得乙個服務的鏈結,這個鏈結是一直會保持到通過 context.unbindservice() 斷掉它。如果在連線時系統中還沒有該服務,則可能會新建立乙個服務,這時 service 的 oncreate 函式也同樣會被呼叫。連線建立時會 service 的 onbinder 會被觸發,通過 onbinder 可以返回連線建立後的 ibinder 介面物件,使用服務的客戶端(比如某個activity )可以通過 ibinder 物件和 service 互動。

乙個 service 如果是通過 bindservice() 啟動的,那麼它會一直存在到沒有任何客戶端與它保持連線為止,原因是可能有很多客戶端與這個服務保持連線,這時如果某個鏈結被客戶端主動斷掉只會是 service 的鏈結數減 1 ,當減至 0 的時候這個 service 就會被銷毀。

3)   乙個 service 既可以被啟動 (start) 也可以被連線 (bind) ,這時 service 的生命週期取決於它被建立的方式,如果是通過 context.startservice() 建立的則和第一種情況一樣,如果是通過context.bindservice() 使用引數 context.bind_auto_create 建立的,則情況和第二種一樣。

當然,在 service 停止,被銷毀時,會觸發其 ondestroy() 函式,我們需要在這裡完成這個 service 相關資源的清理,比如停止其子執行緒,登出***等等。

如下是 service 的生命週期時序圖:

3. 幾個需要注意的地方

1)    service 無論以何種方式建立,都是在應用的主線程裡建立的,也就是說建立乙個 service 並不意味著生成了乙個新的執行緒, service 的建立過程是阻塞式的,因此也需要考慮效能,不能影響介面和邏輯上的後續操作。

2)   如果 service 自己沒有生成新的執行緒,那它也是執行在應用的主線程裡的,因此 service 本身並不能提高應用的響應速度和其他的效能,而是說通過這個後台服務生成新的執行緒來處理比較耗時的操作如大資料的讀取等來提高響應, service 自己並不能保證這一點。 service 相當於提供了乙個這些費時操作的平台,由它在後台建立新執行緒完成這些任務,以及視各種情況管理這些執行緒,包括銷毀。

Service生命週期

1 通過startservice開啟服務 oncreate onstartcommand 2 通過stopservice關閉服務 ondestroy 說明 如果在未stopservice的情況下,再去startservice,只會onstartcommand 3 通過bindservice開啟服務 ...

Service生命週期

service生命週期 使用context.startservice 啟動service 其生命週期為context.startservice oncreate onstart service running context.stopservice ondestroy service stop 如果...

Service生命週期

service有兩種啟動方式 l context.startservice 當它第一次被呼叫時,service被建立執行oncreate 方法,隨後即呼叫onstartcommand 方法。如果是以這種方式啟動,那麼它會一直執行,不論是否有呼叫者繫結,直到context.stopservice 被呼...