整个原始问题都是基于一个错误。您永远不能final static FIELD
在构造函数中分配常量的值。如果可以的话,每次创建类的新实例时,静态 FIELD 的值都会发生变化。不是很最终!
相反,我可以做我一直在做的事情(并且可能会造成内存泄漏,我有很多东西要学),即使用一个static
(但不是final
)字段来指向我的 Activity 的最新实例(参见下面的代码示例)。正如下面关于内存泄漏的评论所指出的那样,我几乎可以肯定通过保留对旧 Activity 对象的引用来造成内存泄漏。
所以我最初的问题的答案真的归结为:这不是一件好事,因为将其他对象引用传递给我当前的 Activity 对象可以让他们阻止系统垃圾收集我的旧 Activity 对象!
无论如何,这是我原来的问题中提到的代码,答案和评论仍然在这里,所以其余的内容仅供参考。
public class MyActivity extends Activity {
public final static MyActivity uI;
public static MyActivity mostRecentUI;
private MyActivity() { // this is the constructor
// In my original post I had:
// uI = this;
// but this is illegal code. `final static anything;` cannot be assigned a
// value in the constructor, because it could be assigned a different value
// each time the class is instantiated!
// Instead the best I can do is
mostRecentUIobject = this;
// and this name better describes what this static variable contains
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}
添加了 4/15:@dmon 甚至评论构造函数将不会运行。它会,任何有任何疑问的人都可以运行这个测试活动:
public class TestActivityConstructor extends Activity {
static long refTime = System.currentTimeMillis();
static String staticExecution = "Static never executed\n";
static String constructorExecution = "Constructor never executed\n";
static String onCreateExecution = "onCreate never executed\n";
static {
staticExecution = "Static Execution at " + (System.currentTimeMillis() - refTime) + " ms\n";
}
public TestActivityConstructor() {
constructorExecution = "Constructor Execution at " + (System.currentTimeMillis() - refTime) + "ms \n";
}
@Override
public void onCreate(Bundle savedInstanceState) {
onCreateExecution = "onCreate Execution at " + (System.currentTimeMillis() - refTime) + "ms \n";
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
((TextView) findViewById(R.id.TV)).setText(staticExecution + constructorExecution + onCreateExecution);
}
}
显然,您需要一个带有名为 TV 的 textview 的简单 layout.xml。无需权限。您甚至可以享受旋转 android 以查看重新创建的应用程序的乐趣,这表明每次旋转屏幕时都会重新运行构造函数和 onCreate,但重新创建 Activity 时不会重做静态分配。