4

これが問題です。ボタンを押して、アイテムのリストを表示する新しいアクティビティを開始し、ユーザーが任意の数のアイテムを選択できるようにし、[送信]をクリックして、そのデータを新しいアクティビティを呼び出した元のアクティビティに送信するアプリケーションがあります。アイテムのリスト。基本的な構造は次のとおりです。

Activity A -> Activity B (select items, press submit) -> [already running] Activity A (receive sent items)

データのやり取りに問題はありません。私が抱えている問題は、アクティビティAを再起動しようとすると、アクティビティのonCreate()メソッドを通過することです。onCreate()メソッドですべてを事前に設定してから、メソッドを介してすでにそこにあるものを補足できるようにしたいので、これを行わない方が好きですonRestart()onCreate()アクティビティを再開するたびにメソッドが呼び出される理由が正確にはわかりません。私の推測は、アクティビティBのアクティビティを呼び出す方法です。

Intent intent = new Intent(this, PatientChartActivity.class);
intent.putExtra("checked", checked);
intent.putStringArrayListExtra("checked", checked);
startActivity(intent);

私はAndroidアクティビティのライフサイクルを見てきましたが、実際に強制する必要がない限り、なぜ自動的に前のアクティビティに戻らないのかわかりません。私が確信していることの1つは、実行中のアクティビティが破棄されていないことです。Log.v(TAG, "DESTROY")メソッドにログメッセージを入れてonDestroy()、アクティビティが破壊されないようにします。以前に開始したアクティビティを復元することをシステムに通知するために、アクティビティを開始するときにさまざまなフラグを使用しようとしましたが、それらも機能していないようです。私はそれらを誤解するかもしれません。私はこのトピックについて広範囲に調査しましたが、私が見つけた解決策はどれも役に立ちませんでした。ここ私が見つけた問題は私のものと同じように見えますが、私が探していたものを解決していないようです。また、問題を回避するための他の可能なルートについては、次のリンクを調べましたが、機能しませんでした。

http://www.droidnova.com/use-intents-to-start-other-activities,76.html

http://www.warriorpoint.com/blog/2009/05/24/android-how-to-switch-between-activities/

4

2 に答える 2

0

それ以外の

startActivity(intent);

アクティビティAで、

startActivityForResult(intent);

このようにして、その特定のアクティビティが実行されたときに結果が得られます。アクティビティAでこれを上書きします。

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    //TODO handle here. 
}

アクティビティBが完了したら、this.finish()を呼び出します。次に、アクティビティAに戻り、上記のメソッドを呼び出します。つまり、アクティビティAのonCreateは呼び出されません。

于 2012-09-22T23:51:50.993 に答える
0

あなたが述べたこと(「アクティビティA->アクティビティB(アイテムを選択して送信を押す)-> [すでに実行中]アクティビティA(送信済みアイテムを受信する)」)に従って実際に行われることは次のとおりです。

アクティビティA=新しいインスタンス->アクティビティBに移動=新しいインスタンス->アクティビティAに再度移動=新しいインスタンス

したがって、アクティビティ「スタック」は、実際にはアクティビティAの2つのインスタンスとアクティビティBの1つのインスタンスです。そのため、アクティビティAの2番目の呼び出しはそれを初期化し、「onCreate()」を再度呼び出します。問題の解決策の1つであり、おそらく最善の方法は次のとおりです。

アクティビティAから、次のメソッドでアクティビティBを開始します:'startActivityForResult()'。次に、現在のようにアクティビティAを開始しているにもかかわらず、アクティビティBで、次の関数を使用して結果をアクティビティAに戻してみてください:'setResult(int resultCode、Intent data)'次に、アクティビティBで'finish()'を呼び出します。 'onActivityResult()'メソッドを実装します。

ここで、アプリケーションのライフサイクルについて説明します。

  • アクティビティAは初期化され、アクティビティBを開始して、結果を待って「何か」を実行します。ここまでは順調ですね。
  • アクティビティBは初期化され、送信後にアクティビティAの結果を設定します。その後、アクティビティBは自動的に終了し、結果は自動的に前のアクティビティに渡されます。
  • アクティビティAが再びフォーカスを取り、ALREADY INITIALIZEDが実行され、「onActivityResult()」メソッドが呼び出されます。アクティビティBで設定され、現在アクティビティBで渡される「インテント」。

それが役立つかどうか、サンプルコードが必要かどうかを教えてください。

于 2012-09-23T01:02:17.967 に答える