Service官方直譯深入理解(基礎知識完)

青樓艾小生發表於2017-05-01

Service

被設計為不和使用者直接互動,在後臺執行長期操作的一種系統元件,也可被其它應用使用。每一個服務必須在AndroidManifest中宣告。服務可以通過Context.startService() and Context.bindService().啟動。Note:service執行在主執行緒,因此執行網路操作需要另起執行緒,但IntentService可以解決這個問題。

What is a Service?

首先,我們來說說服務不是什麼:

1:服務不是一個單獨的程式,通常情況下它執行在應用程式的一部分

2.服務不是執行緒,它不能在應用無響應時工作

下面來說說服務兩個主要的特徵:

1.很方便的通知系統,我有一些後臺任務需要處理,直到明確停止服務

2.很方便的給其它應用提供功能

Note:因為服務很簡單,所以我們可以以任何我們想互動的方式來設計一個服務。我們可以將服務看成一個可以隨時呼叫它方法的普通的Java物件,通過AIDL來互動。

Service Lifecycle

服務可以通過兩種方式啟動。如果有人呼叫了Context.startService(),那麼服務的oncreate()和onStartCommand(Intent, int, int)會被回撥,不管執行多少次startService,服務都不會重新建立,而會多次呼叫onStartCommand,所以並不存在停止不了服務的情況。服務會持續下去直到Context.stopService() or stopSelf()被呼叫。onStartCommand返回的不同值對應不同的服務需要。

使用者還可以通過Context.bindService()來持有一個服務連線。當服務沒執行的時候將會呼叫oncreate方法,但不會呼叫onStartCommand方法。客戶端會接收到服務onBind(Intent)方法回撥的IBinder物件,允許客戶端回撥服務裡面的方法。通常情況下,IBinder是由複雜的介面建立的。

上述兩種啟動方式可以同時存在

Permissions

當一個服務在清單檔案中宣告,全域性訪問它將會拒絕。這時需要在自己的清單檔案中宣告合適的許可權來啟動,停止和繫結特定的服務。以Android 2.3為例,當呼叫Context.startService(Intent),我們也需要設定Intent.FLAG_GRANT_READ_URI_PERMISSION and/or Intent.FLAG_GRANT_WRITE_URI_PERMISSION。

這會暫時同意Service訪問Intent指定的Uri,直到服務停止。這個對Service沒有exported也同樣適用。


Process Lifecycle

Android系統會盡可能長的保留持有service的程式,但是當記憶體不足需要殺掉一些程式時,有如下的優先順序:

1.當前服務正在回撥onCreate(), onStartCommand(), or onDestroy()方法,則視為前臺程式,不會被kill

2.當服務長期執行在後臺時,有極高的可能性被kill

3.我們可以通過startForeground(int, Notification)來設定前臺程式,除非在記憶體極端緊張下,否則不會被殺

Note 有很大的可能,一個正在執行的服務在記憶體不足時會被系統殺掉,但是被殺掉後,系統會稍後試著重啟這個服務。我們可以在onStartCommand()方法用START_FLAG_REDELIVERY回撥一個Intent來繼續執行我們的服務


基礎完


相關文章