2012-07-15 45 views
13

我可以依靠聲明應用程序的Context在應用程序的生命週期中沒有改變嗎?如果我在某處使用單身模式存儲context,然後在需要的地方使用,該怎麼辦?在應用程序生命週期中可以更改應用程序上下文嗎?

+0

也許這可能會有所幫助:http://stackoverflow.com/questions/708012/android-how-to-declare-全局變量/ 4642069#4642069 – 2012-07-15 09:04:14

+1

爲什麼你需要存儲上下文?您可以隨時通過調用getApplicationContext() – Yury 2012-07-22 15:04:21

+0

@Yury獲取它:不是來自非活動或應用程序類。 – 2016-02-08 15:24:48

回答

14

先回答你的第二個問題:如果你需要存儲在一個單獨的一些狀態,那麼你可以使用Android Application類和你Application成爲你單身(它也是一個Context)。沒有必要存儲它。

關於第一個問題,至於是否Context可以在運行時改變:排序相關your other question,我認爲我們可以明白這一點通過查看ContextWrapper.attachBaseContext

protected void attachBaseContext(Context base) { 
    if (mBase != null) { 
     throw new IllegalStateException("Base context already set"); 
    } 
    mBase = base; 
} 

所以,是的,你可以依靠它;它不能改變,如果你嘗試,它會拋出一個IllegalStateException

+0

如果應用程序因某種原因被殺害會是什麼情況? – Eugene 2012-08-22 20:42:35

+0

如果應用程序被殺害,你無法做任何事情,因爲你也被殺了。您是否需要在停止並重新啓動的應用程序中保存數據?你想使用共享首選項。 – 2012-08-22 21:01:54

0

在應用程序類中是android應用程序的單一應用程序級別類。我的回答是,你不能改變應用程序上下文對象。

1

圍繞這個話題有一些爭議。甚至有一部分來自谷歌的人。 我堅持我認爲是正確的方法,它基本上儘可能多地獲取活動環境。原因在於,上下文的重點是爲應用程序的某些資源/部分提供正在工作的環境。您給系統的信息越準確,意想不到的行爲就會發生(例如:您只需訪問活動上下文範圍內的一些資源,並從應用上下文中獲得一些途徑)。

請記住,活動是一個上下文,所以如果你在一個活動中傳遞「this」將會使這個工作成爲可能,或者如果你的代碼在一個片段中工作,那麼傳遞「getActivity()」。 .com。使用自己的Application類作爲Singleton非常有用,因爲您可以輕鬆管理應用程序的生命週期並將其用作適當的中間點。再一次,獲取appContext足以調用getApplicationContext或甚至你的應用程序單例類的實例。

1

是的,您可以依靠在應用程序生命週期中不更改上下文!

谷歌在Application課堂概述中這麼說。

我認爲這對你的情況來說是完美的。

1

應用程序是一個單身人士,我不知道如何繞過這一點,而不需要改變核心。

但是,如果您的代碼啓動另一個進程,則可能會遇到2個Application對象的實例。一個例子是啓動遠程服務;這將創建另一個將創建它自己的應用程序對象實例的進程。

http://developer.android.com/reference/android/app/Service.html#RemoteMessengerServiceSample

爲了避免必須將遠程服務和使用的Parcelable或序列化機器人選項之一的應用程序的其餘部分之間進行通信混亂:

消息 - 意圖putExtra

處理程序 意圖包

或創建一個自己的

相關問題