2012-07-27 58 views
5

我試圖在收到推送通知時更新UI的狀態。爲了做到這一點,我需要啓動一個AsyncTask來執行一些網絡操作,然後根據結果更新UI。使用BroadcastReceiver啓動AsyncTask

根據文檔對BroadcastReceiver,接收機內執行異步操作是不安全的,因爲它執行的處理可以被立即返回onReceive()殺死,假設有在該過程中沒有其他「應用程序組件」。

BroadcastReceiver是在其自己的進程中運行,還是在與包含Activity相同的進程中運行?由於我只關心完成任務,只要有UI更新,我不擔心如果活動關閉,AsyncTask臨死。假設BroadcastReceiver與活動處於同一個過程中,這是否可以啓動我在接收器中描述的任務,這樣做是否安全?

編輯:

要澄清,我註冊在活動的onResume()接收器和註銷其onPause(),所以它應該只接受意圖時,活動已經激活。

+0

如果不安全,爲什麼不使用「服務」而不是BroadcastReceiver?它會完成同樣的事情,但沒有你提到的問題。 – Andy 2012-07-28 00:34:39

+0

@我知道在任何情況下使用「服務」都是安全的,但我試圖確定在這種情況下是否真的有必要。 – jnackman 2012-07-28 00:39:48

+1

好吧,如果你考慮一下。服務非常適合運行異步操作。因此,爲什麼同樣的限制不存在。 BroadcastReceivers主要用於其他事情,比如系統發生什麼事情,而不是通過網絡更新數據。因此「廣播」。雖然「服務」就是這樣,但您正在運行的服務用戶不需要知道。希望這是有道理的。 – Andy 2012-07-28 00:43:39

回答

5

廣播接收器沒有運行在它自己的進程上,它運行在UI線程上。

只有在應用程序中沒有其他活動或服務正在運行時,您的進程纔會在onReceive方法返回後終止。

如果您的廣播接收器是一個內部類的實例,並且只有當您的活動處於活動狀態時纔會收到,那麼在onReceive方法返回後,您的過程將不會被終止。

+0

[鏈接到官方文檔](http://developer.android.com/reference/android/content/BroadcastReceiver.html#ProcessLifecycle) – renadeen 2014-06-05 12:41:37

0

我建議做的是從廣播接收器中的startActivity(intent)。就這樣。在意圖中,我會提供您所說的事件信息,您可以在包中設置一個參數。然後,您可以在活動onStart()onCreate()中查看這個內容,無論哪個被調用。如果旗幟在那裏,那麼從Activity開始AsyncTask

根本不需要使用服務,所有綁定和通信限制都來自服務活動。

還記得你也可以startActivityForResult()以及。我認爲你不想做任何事情,除了在廣播接收器中傳遞和轉發。

順便說一句,活動不需要有用戶界面。可能會有不露面的活動。

+0

正如你所說 - _ ...活動不需要UI's_ - 然後我推薦他使用服務......我認爲活動是用於UI和後臺任務的服務。 – 2012-07-28 16:05:43

1

如果在您的AsyncTask之內,您需要一個上下文,那麼我認爲服務更好。如果沒有,使用AsyncTask沒有問題。

1

在Honeycomb(API11)之前,您必須使用服務。

由於蜂窩(API11),你可以使用goAsync()

這可以通過一個應用程序中的onReceive(上下文,意圖)被調用來 允許它保持廣播主動從 函數返回後。這並不會改變對廣播的響應(在10秒內完成它)的相對 的期望,但確實允許 實現將與其相關的工作轉移到另一線程 以避免由於磁盤IO而干擾主UI線程。

相關問題