這個答案的第一部分是真的老了 - 請參閱下面的正確辦法做到這一點
您可以使用Application對象存儲應用持久對象。 This Android FAQ也討論了這個問題。
事情是這樣的:
public class MyApplication extends Application{
private String thing = null;
public String getThing(){
return thing;
}
public void setThing(String thing){
this.thing = thing;
}
}
public class MyActivity extends Activity {
private MyApplication app;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
app = ((MyApplication)getApplication());
String thing = app.getThing();
}
}
的正確方式:
當第一次寫這個答案,對於活動的生命週期的文檔的情況不是很好,因爲它是現在。閱讀Saving Activity State關於Activity文檔的章節有助於我們理解Android如何讓我們保存狀態。從本質上講,您的活動開始有兩種情況:(1)作爲新活動;(2)由於配置更改或由於內存壓力而被重新創建時。當您的活動因爲是新活動而啓動時,則saveInstanceState爲空。否則它不爲空。如果它爲空,那麼你的活動應該從頭開始初始化自己。碎片與活動非常相似,我詳細介紹了我的AnDevCon-14 slide deck這個概念。您還可以查看我的AnDevCon-14演示文稿的sample code以獲取更多詳細信息。
重做我以前的例子看起來像下面的代碼。我確實改變了語義 - 在第二個版本中,我假設字符串thing
是特定於android task內的活動,在前面的示例中它是不明確的。如果你確實想要爲多個android任務保留相同的數據,那麼使用Application對象或其他單例仍然是你最好的選擇。
public class MyActivity extends Activity {
private static final String THING = "THING";
private String thing;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState==null) {
// First time here (since we last backed out at least)
thing = initializeThing(); // somehow we init it
} else {
// Rehydrate this new instance of the Activity
thing = savedInstanceState.getString(THING);
}
String thing = app.getThing();
}
protected void onSaveInstanceState(Bundle outState) {
outState.putString(THING, thing);
}
}
不肯定的回答你的問題,但我知道的是,Android開發建議不要將你的靜態引用不必要的,因爲它們容易記憶泄漏:http://android-developers.blogspot.com/2009/01/avoiding-memory-leaks.html – I82Much 2009-10-28 13:25:29
好吧,那篇文章是關於泄漏上下文。如果通過該靜態引用可以強烈地訪問上下文,則這只是一個問題,例如,意見,但不是捆綁(據我所知?)。但通常我會假設靜態引用,一旦類被加載,只要應用程序一直存在,這在Android中似乎不是真的。 – Matthias 2009-10-28 13:46:09