2011-07-21 32 views
0

我正在創建一個在後臺運行的服務。它具有以下功能:每隔X分鐘服務按間隔運行任務;它應該是它自己的過程嗎?

  • 收集用戶的數據(許可)
  • 奔跑某些任務,而這個數據發送到服務器的每Y個分鐘
  • 我想,如果其他人能編寫自己的用戶界面,小工具和其他很酷的東西。

當前,服務在任務運行/網絡發送(沒有喚醒鎖定)之間繼續運行。

該服務監聽驗證和運行時更改;這需要一個單獨的過程。有辦法解決這個問題,但他們會涉及使用IPC(我認爲這不會造成大的性能下降)。

問題:

  • 如果該服務被允許在任務之間死或者我應該讓它沒有激活鎖定運行?
  • 保持活力比每分鐘左右打開一個數據庫更有效嗎?
  • 如果不在單獨的進程中,人們可以使用我的服務嗎?

回答

3

問題出現了,我的服務應該在它自己的過程中嗎?

不,我的意思是說它應該和所有其他組件一樣運行。

我認爲如果其他人可以編寫自己的用戶界面,小部件和其他很酷的東西,它會很好。 它沒有必要在這個權利在一個單獨的過程?

不會。它會自動處於與「其他人」代碼分開的過程中。

眼下服務保持運行之間運行任務/網絡發送(不保持激活鎖定雖然)我推測這將是比打開一個數據庫/做設定每分鐘左右更有效。

您的用戶可能會不同意此計劃。永久性服務是用戶通過設置應用程序攻擊任務殺手和強制停止的開發者的原因。

它應該被允許在兩者之間死亡還是應該讓它在沒有喚醒鎖的情況下運行?

我建議您使用IntentService(因爲您需要網絡I/O的後臺線程),並讓服務在輪詢之間關閉。另外,請允許用戶從開頭的段落中控制X和Y的值。

如果我的服務死在中間(不得不重新打開數據庫),任務會在間隔時間內運行?

一般來說,是的。打開數據庫只需要很短的時間(例如幾毫秒),除非閃存存儲器忙。這是一個小的代價,用於避免用戶對您的服務始終運行的投訴。

如果人們不在一個單獨的過程中,人們可以使用我的服務嗎?

是的,只要你暴露了一些API(AIDL,記錄集的Intents通過startService()發送的命令等)。

+0

工作線程在服務被終止時不會死掉嗎?我有很長時間的運行任務,我希望能夠在運行時處理其他事情,這就是爲什麼我迄今尚未使用IntentService。 –

+0

@尼克拉斯答:我不知道你在說什麼。 – CommonsWare

+0

如果我從onHandleIntent中產生一個工作線程,該線程會在服務關閉時死掉,但我很清楚...由於intent服務無法同時處理多個意向,因此會發生此問題。 –

0

在我看來,將純粹的應用程序專用於服務可能是值得的(即除了「設置」活動以外沒有其他組件),並通過意圖執行所有操作。

只要清單具有使用<intent-filter>塊註冊的所有可能的Intents,任何人都可以與之通信(您自己的應用以及任何第三方應用)。

此外,您可能需要使用IntentService,它會在到達時處理命令,然後在完成時自行關閉。

沒有完全理解您的要求,即服務正在處理的是什麼,很難進一步提出建議。

+0

用戶傾向於不喜歡沒有任何活動的應用。我們用app-widget-only應用程序看到了很多 - 用戶抱怨應用程序「中斷」,因爲他們在啓動器中沒有看到它的圖標。 – CommonsWare

+0

@CommonsWare:其實我同意你的觀點,並且我已經編輯了我的答案以包含'設置'活動。我的推理是,Niklas提到其他人正在開發自己的附加組件,因此,他會與'techie'用戶打交道,因爲沒有啓動器,他們不一定會認爲該應用程序「中斷」。我仍然認爲最低限度的方法可以起作用,但「設置」活動會有意義。 – Squonk

+0

好吧,我們也有自己的用戶界面 –

相關問題