2012-12-30 36 views
8

我有一個asynctask做了一些事情,當它完成時,我希望它廣播它完成。發送來自Async服務器的廣播

通常我會這樣做:context.sendBroadcast(new Intent(MYINTENT));但是asynctask沒有上下文。我已經看到了這個問題的一些答案,建議將該應用程序活動的上下文引用到asynctask。但如果用戶旋轉屏幕,則該引用是不好的。並手動維護引用是一個不好的解決方案(需要太多的創建asynctask,我不控制)。現在的問題是:

1)爲什麼android會像這樣設置?爲什麼我甚至需要一個上下文來發送廣播,當廣播可以註冊並由其他上下文處理?

2)有沒有很好的解決這個問題? (好=需要儘可能少的活動創建asynctask,倖存旋轉等)。

+1

使用'Activity.getApplicationContext()'將Applcation上下文傳遞給'AsyncTasnk'。應用上下文不會受到屏幕旋轉的影響,這意味着在潛在旋轉後對其的引用仍然有效。 – Paul

+0

@保羅很好的解決了技術問題,謝謝。仍然想知道爲什麼我甚至需要發送廣播的背景(從設計的角度來看)。 – Oren

回答

16

您現在在AsyncTask中使用的上下文是當前活動的上下文。默認情況下,屏幕旋轉將銷燬該Activity的當前實例並創建一個新的實例。 這是(即使它起初看起來不那麼)預期的行爲。原因是你可能想爲不同的屏幕方向有不同的資源(佈局,繪圖等)。爲了應用這些潛在的不同資源,Android會在每次輪換時重新創建活動。

您可以通過在AndroidManifest.xml文件中設置android:configChanges屬性來抵消該情況,但在您的情況下,不建議使用此解決方案。

處理此問題的正確方法是將應用程序上下文傳遞到AsyncTask而不是您的活動(Activity繼承自Context)。您可以通過從您的活動實例中調用getApplicationContext()來完成此操作。 您的應用程序上下文將持續諸如屏幕旋轉之類的事件並持續到系統終止應用程序。

至於爲什麼你需要上下文的實例做基本任務:

接口有關的應用程序環境的全局信息。這個 是一個抽象類,其實現由Android 系統提供。它允許訪問特定應用的資源和 類,以及向上調用應用程序級的操作,如 開展活動,廣播和接收意圖等

這是官方文件如何定義Context。 也許有人可以更好地解釋這一點,但對我自己來說,這個定義就足夠了。