2014-02-22 108 views
1

我有一個AlarmManager,每X分鐘觸發一次報警。廣播接收機或服務?

當警報觸發時,我正在做一些操作,如讀取一個小文件和更新SharedPreferences。

在這種情況下推薦使用什麼操作?

服務似乎很合適,但由於這些操作相對較短,可能BroadcastReceiver更好(更輕?)?

看來,BroadcastReceiver和一個服務都在同一個進程和UI線程上運行,唯一的區別是Android如何以及何時會殺死它們。那是對的嗎?

據我瞭解,AlarmManger可以調用接收器或服務(或一個活動,但現在不相關)。即使我的應用程序未運行,我的鬧鐘也會始終運行。因此,無論哪種方式(服務或廣播接收器)都會啓動我的進程,如果這是我的應用程序未運行。警報可以每10秒鐘關閉一次,這取決於用戶。所以在這種情況下,IntentService將不得不每10秒啓動一個線程。這不是對系統的「苛刻」嗎?謝謝。

+0

在我的應用程序中,我用AlarmManagar使用BroadcastReceiver。不要沒有更好的服務或BroadcastReceiver。@Ran – PSK

+0

爲了記錄,如果你想嘗試,在兩者之間「切換」並不困難。創建和使用服務是相對平凡:) –

+0

@MartínMarconcini,我同意,但我不知道我應該測量什麼來決定哪一個更好:)顯然,兩者都可以正常工作。 – Ran

回答

2

如果您已經在使用AlarmManager,則可以在任何Activity(或Fragment)的代碼中使用BroadcastReceiver來執行您提到的操作。請記住,要麼在UI線程上運行,請使用AsyncTask或Thread。

您不需要運行服務,因爲您的警報將由AlarmManager觸發。無需爲此產生新的流程(服務)。

從另一個角度(如果使用服務),您可以通過不使用AlarmManager並每隔X分鐘發佈一次Runnable來解決問題,但第一種方法應該沒問題。

UPDATE

也許你誤解了我。服務可以在不同的進程中運行(儘管默認情況下不會這樣做),但它與BroadcastReceiver不同。如果您使用AlarmManager,則不需要運行服務。

Service和BroadcastReceiver之間的區別通常是新Android開發人員之間混淆的來源。

如果不知道每X分鐘需要執行的工作性質,很難說出最佳方案。

只要您瞭解運行服務(以不同的模式)的後果和/或如何不阻止UI線程,那麼是的,使用服務通常很好,即使IntentService也可以幫助您。

也許你想將你的AlarmManager與IntentService耦合,但要注意這並不妨礙設備進入睡眠狀態,不妨使用 WakefulIntentService,它會爲你保留一個喚醒鎖。

+0

服務運行在與UI相同的進程和線程上,所以它不是一個新進程。看起來,所有不同之處在於Android在殺死它。 – Ran

+0

我更新了我的問題,以便更清楚,謝謝。 – Ran

+0

如果你的任務的本質是「偶爾做幾件事」,我認爲你不需要服務。無論用戶在前臺執行什麼操作(即使他當時不在應用程序中),服務都是要在後臺執行一段時間的操作。意向將被廣播給具有匹配意圖過濾器的所有接收器。但廣播接收機做了一些事情並完成了。 (直到你再次打電話給他們)。如果每次鬧鈴之間可能有「分鐘」,我會與無線電通信局聯繫。 –

1

廣播接收器(短接收器)是一個Android組件,允許您註冊系統或應用程序事件。一旦發生此事件,Android運行時會通知所有註冊的事件接收器! 是的,你可以使用它