2010-01-14 50 views
6

似乎有兩種方法可以執行後臺任務。我的用例是讓我的應用程序每隔x分鐘讀取一次數據饋送,而不管我的gui是否正在運行,而不管手機是否正在睡眠。如何安排後臺任務

我使用alarmmanager安排意圖相匹配的廣播接收器。在onRecieve方法中,我啓動一個服務(startService),該服務產生一個AsyncTask。任務提取數據並存儲它,然後stopSelf()服務。

在onRecieve方法我AQUIRE一個PARTIAL_WAKE_LOCK

,啓動服務之前,只是在服務調用stopSelf()之前,我再次釋放。

這真的是最好的方法嗎?我甚至需要在這種情況下的服務?

我遇到這種設置,其中設置適用於小時,然後突然停止,這使得它很難調試奇怪的行爲。

有沒有人有一個簡單的萬無一失的方法,才達到同樣的目的?

回答

5

我使用警報管理器安排與廣播接收器匹配的 意圖。 在onRecieve方法中,我啓動了一個 服務(startService),該服務產生了一個AsyncTask 。該任務獲取數據 並存儲它,然後stopSelf() 服務。

我建議使用IntentService代替AsyncTask/stopSelf()模式,但除此之外,這似乎聲音。

在onRecieve方法

我AQUIRE一個 PARTIAL_WAKE_LOCK,啓動 服務之前,只是調用 stopSelf()在服務之前,我再次釋放 它。

這很有道理。我在我的WakefulIntentService開源組件中做了很多相同的事情。

這真的是做到這一點的最好方法是什麼?

你肯定似乎接近。

我是否甚至需要在此 情況下的服務?

如果您需要按計劃完成的工作只需要一秒左右,您可以在BroadcastReceiver中完成。否則,您需要在後臺線程上完成該工作,並且BroadcastReceivers不能分叉後臺線程。

+0

aha!所以我無法在播放器中啓動我的asynctask?即使我在onrecieve中獲得了wakelock,並在asynctask完成時釋放它? 感謝您提供的信息,我想我需要爲我的鬧鐘提供更多的幫助 – Wilken 2010-01-14 15:23:29

+0

「所以我無法在播放器中啓動我的asynctask?」我不這麼認爲,但我還沒有嘗試過。AsyncTask擁有自己的線程池,它可能*可以安全地從BroadcastReceiver運行AsyncTask。 – CommonsWare 2010-01-14 16:01:34

+0

感謝使用IntentService的想法,不知道這一點。現在我已經放棄了我的服務和AsyncTask。更優雅。 – Wilken 2010-01-14 18:15:57