2011-11-18 58 views
0

我有一個Android服務在與客戶端不同的進程中運行,並且只在客戶端連接時才運行。我想知道在它的生命週期中究竟是否接受來自客戶端的請求?Android服務在其生命週期中何時可用?

我在服務生命週期的早期/晚期發出請求時遇到問題。據我所知,每個請求都是在與主Service線程分開的線程中處理的。我有以下問題:

  • 請求由服務在Service.onCreate()之前或期間處理。我已經看到嘗試使用在我的Service.onCreate()中初始化的資源的異常,但它們爲空,並且日誌記錄證實主Service線程位於onCreate()中。
  • 請求在Service.onDestroy()期間或之後由服務處理。異常和日誌記錄再一次證實一個線程正在處理請求並嘗試使用已經在onDestroy()中釋放的資源。

Android可以允許對未完全初始化或銷燬的服務發出請求嗎?

+0

你試過使用隱式意圖嗎? – 2011-11-18 13:58:02

+0

嘗試利用主線程中的所有功能。創建一個單獨的線程會給你記憶問題。在異步任務中啓動您的服務,然後在PreExecute上啓動您的服務。你可以在PostExecute上停止你的服務,但這是根據你的程序的功能 – 2011-11-18 13:59:54

+0

你的問題是相當誤導。無論何時客戶發送相應的意圖或與其綁定,服務就是或者變得「可用」。 * Thread *的生存時間應該由服務來控制 - 反之亦然。當服務尚未創建時,工作線程如何處理請求? – JimmyB

回答

1

我有一個Android服務在一個單獨的進程中運行,從它的客戶端

請不要這樣做,除非這些流程代表不同的應用程式。

我想知道在它的生命週期中究竟是否接受來自客戶端的請求?

「請求」是一個沒有意義的術語。我假設通過「請求」您的意思是「調用由服務發佈的Binder暴露的方法」。

據我所知,每個請求都是在與主Service線程分離的線程中處理的。

對線程池中的線程調用對由Binder公開的方法所做的調用,它與主應用程序線程分開。它是Android中Android的幾個地方之一,Android可以從單獨的線程調用您的代碼。

請求在Service.onCreate()之前或期間由Service處理。

這應該是不可能的,因爲onBind()將不會被調用,所以沒有Binder。沒有什麼可以提出「請求」。

的請求由服務期間或Service.onDestroy()

我不能排除這種可能性後處理。我認爲在調用onDestroy()之前,Android會拆除IPC接口。

這就是爲什麼我想知道服務在哪個階段被認爲「可用」。

當客戶的ServiceConnectiononServiceConnected()調用時,它是「可用的」。如果服務不存在,將在onCreate()onBind()之後發生。