元の質問全体は間違いに基づいていました。final static FIELD
コンストラクターで定数の値を割り当てることはできません。可能であれば、クラスの新しいインスタンスが作成されるたびに静的FIELDの値を変更できます。あまり最終的ではありません!
代わりに、これまで行ってきたことを実行できます(メモリリークが発生する可能性があるため、学ぶことがたくさんあります)。これは、static
(ではなくfinal
)フィールドを使用して、アクティビティの最新のインスタンスを指すことです(以下のコードサンプルを参照してください)。 )。メモリリークについての以下のコメントが指摘しているように、私はほぼ確実に、古い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と呼ばれるテキストビューを備えた簡単なlayout.xmlが必要です。権限は必要ありません。Androidを回転させて、画面が回転するたびにコンストラクターとonCreateの両方が再実行されることを示すアプリが再作成されるのを確認することもできますが、アクティビティが再作成されるときに静的な割り当ては再作成されません。