2013-07-01 81 views
2

我的應用程序,我想運行所有的時間,我通過讓服務啓動另一個線程完成,並響應請求發送到其Handler本地服務。 綁定到服務將返回後臺線程的處理程序,以便客戶端活動可以發出請求。Android的本地服務綁定和後臺線程

到目前爲止這麼好。

我的應用程序使用Fragment S的需要使用服務,以確定其初始狀態。當片段被實例化以響應用戶輸入時,沒關係,因爲那時服務被綁定到片段的父活動。也就是說,框架已經調用ServiceConnection.onServiceConnected,並且該活動知道其片段可用於與服務通信的Handler

當我的活動被重新實例化以響應方向變化時,我的問題就開始了。從我的堆棧跟蹤中可以看出,在這種情況下,框架在主線程的消息循環中重新創建了所有活動片段,之前已調用ServiceConnection.onServiceConnected,因此它們無法在娛樂中訪問該服務相。

,我發現的唯一的解決方案是公佈其後臺線程應用程序全局狀態相關聯的處理程序服務。 (我爲此目的劃分Application,儘管還有其他技術。)我終究使用它的'線程'而不是'服務'。

這似乎是一個簡單而有效的方式做一些事情,看來Android想拍尷尬和複雜。除了通常對全球狀態的一般保留之外,我的方法忽略了哪些Android特定的考慮因素?或者有什麼更好的辦法來實現同樣的目標,我希望這是明確的?

回答

1

如果我理解正確的話,你可能有興趣在尋找到IntentService。 IntentService是一種服務,它在綁定時啓動它自己的線程,並在收到它時處理Intents。你已經看過它了嗎?

+0

謝謝。這使我走上了一條良好的軌道。我不想使用'IntentService',因爲我的後臺線程有特定的初始化,我不想再次發生,但'startService(Intent)'可能是我需要的。我對此沒有足夠的考慮。 – JulianSymes

+0

其實我不認爲這會起作用,因爲我需要通過引用後臺線程的處理程序來傳遞任意對象,並且我不認爲我可以通過Intent機制傳遞這些對象。我需要把它們放入一個我發給Handler的消息中。 – JulianSymes

+0

糾正我,如果我錯了,但不能讓你想要傳遞的對象實現Parcelable接口?這將允許您編組/解組這些對象,並將它們傳遞給新創建的IntentService上的Thread。看看這個鏈接如何做到這一點。 http://android-er.blogspot.com/2013/03/example-to-implement-parcelable.html – Emmanuel

1

Android的做事方式 - 這往往是尷尬的,但是 - 公平 - 只是因爲它意味着解決一些非常尷尬的問題。

您可以:

  • 或者使用Android的架構一路走下去,
  • 還是儘量避免它(與UI通常的除外)。

將這兩種方法結合起來很棘手,因爲它經常讓你處於兩個世界中最糟糕的狀態。

你的情況(我知道你使用的是綁定服務,因爲你需要傳遞真實的引用 - 所以切換到基於意圖的服務是 - 出於某種原因是不可能的),我將刪除Service和Application子類。在你描述的場景中,根本不需要它們中的任何一個。一個簡單的純Java單身人士將會做。

另一種組合是擁抱Android的方式。在這種情況下,您可以創建一個包裝,連接到Service的代碼並使其子類爲Loader。這樣你可以有一個由LoaderManager管理的連接實例。

API的原創作者可能希望您重新編寫應用程序,以便所有數據都從內容提供者讀取並由異步服務(或許不知道,誰知道......)修改。

+0

謝謝。據我記憶,我使用服務的最初原因是我必須做出響應BroadcastReceiver報警的工作,而且我不確定會不會有什麼保護我的線程免於死亡如果它不是從服務啓動的。我誤解了嗎? – JulianSymes

+1

線程與服務沒有任何關聯(如何才能工作?!),所以無論它們是在服務內部還是在其他地方創建都無關緊要。如果你需要你的過程來保持活力(就像腳步入門一樣),你也可以創建一個完全空的類來擴展Service並調用Context#startService。在您調用Context#stopService之前,它將被視爲「正在運行」(無論這意味着什麼)。您不必以任何方式觸摸它,或將任何代碼放入其中。 – fdreger

+0

線程可能如何與服務關聯的問題確實發生在我身上,但是如果不是,那麼看起來像一個簡單的方法來打敗Android在資源耗盡的情況下管理應用程序組件的嘗試。要管理單個實例我的後臺線程看起來最簡單的方法是將startService關閉警報BroadcastReceiver,並讓服務的onCreate啓動線程。 – JulianSymes