这个答案的第一部分是真的老了 - 请参阅下面的正确办法做到这一点
您可以使用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