0

ボタンを介して別のアクティビティから開始され、開始時にインテントが渡されるアクティビティがあります。アクティビティはインテントで開始されるため、アクティビティが数回作成され、上記のボタンを押すたびにonCreate()が呼び出されることがわかりました。私が読んだドキュメントでは、「「標準」アクティビティの新しいインテントがあるたびに、そのインテントに応答するクラスの新しいインスタンスが作成されます」と書かれているので、そのアクティビティのインスタンスがどこかにあると思います。スタック上。アクティビティには他のアクティビティから参照される静的変数がいくつかあり、この変数の値が決定論的であることを確認したいので、これは避けたいものです。

私が欲しいのは、ボタンを押したときに既存のインスタンスをすべて削除してアクティビティの新しいインスタンスを作成するか、アクティビティを1つだけにして、毎回新しいインテントで作成することです。

アクティビティにandroid:launchMode = "singleTop"を設定し、onNewIntent(intent)を実装することで、これを実現しようとしました。これにより、このシナリオのアクティビティのインスタンスが1つだけになり、新しいインテントを取得できるようになります。ただし、このようにすると、基本的にonCreate()メソッド全体をコピーする必要がありますが、新しいインテントを使用するだけで、間違っているように感じます。

public void onNewIntent(Intent intent) {
    myAdapter= null;
    serverThread.stopThread();
    serverThread = null;
    this.onCreate(...);  // <- somehow do all this with new intent
}

この状況を簡単に解決する方法を知っていますか?

4

3 に答える 3

2

すべてのコードをonCreate()からonStart()に移動して、アクティビティが開かれるたびに呼び出されるようにすることができます

于 2012-12-02T11:04:19.820 に答える
0

フラグFLAG_ACTIVITY_REORDER_TO_FRONTを設定してみてください。スタックにアクティビティが存在する場合、そのアクティビティが前面に表示されるようになります。

Intent intent = new Intent(getApplicationContext(),
            YourCustomActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
于 2012-12-02T11:10:54.890 に答える
0

上記の状況では、ユーザーがインテントを作成してアクティビティを開始するボタンを使用して前のアクティビティに戻るときに、実際にはonDestroy()が呼び出されます。つまり、実際には、この場合、アクティビティのインスタンスはすでに1つだけであり、前のインスタンスは破棄されています。

このため、上記の設定ではonNewIntent()は呼び出されません。たとえば、上記の質問のコードでサーバーを停止して、ボタンをもう一度押したときに新しいサーバーを起動できるようにする場合は、実際には次のようにするだけです。

@Override
public void onDestroy() {
    serverThread.stopThread();  
    super.onDestroy();
}

それが他の人を助けることを願っています:)

于 2012-12-02T14:45:53.407 に答える