2

私のアプリでは、次の構造があります。

アクティビティ A はアクティビティ B を呼び出して終了し、スタックから自身を削除します。アクティビティ B は、実行するアクションを指定するアクティビティ A からインテントを受け取ります。これらのアクションが実行されると、それを示すメッセージがユーザーに表示されます (まだアクティビティ B にあります)。ユーザーがホーム ボタンを押すと、アプリはバックグラウンドに移行し、を呼び出し"onPause"てから"onStop". すべてが期待どおりに機能します。

問題は、ユーザーがアプリをバックグラウンドで数時間放置し、(数時間後に) 再度アプリを開こうとするとonCreate、アクティビティ B のメソッドが、数時間前に受信したものとまったく同じ意図で呼び出されることです。活動A。

(ユーザーが数分後にアプリに戻ると、離れたときと同じようにアクティビティ B が表示されます)

私が望んでいたのは、この場合、アプリがアクティビティ B ではなくアクティビティ A を開くか、アクティビティ B を開くが、ユーザーが去ったときに画面に表示されていたメッセージを表示することでした。

アクティビティのライフ サイクルを見ると、アプリが OS によって強制終了されているように見えますが、これはすべて理にかなっています。アクティビティ B がonCreateメソッドと以前と同じ意図で開く理由が本当にわかりません。

4

3 に答える 3

1

onSaveInstanceState()ActivityB の状態を記録するために使用します。Android は、プロセスを強制終了する前にこれを呼び出します。ユーザーがアプリケーションに戻ると、プロセスが再作成され、アクティビティ スタック (この場合は ActivityB) の一番上にあったアクティビティが再作成されます。これを行うと、保存されたインスタンスの状態がonCreate()呼び出しのパラメーターとしてアクティビティに渡されます。プロセスの強制終了/再起動後にActivityBが再作成されていることを認識できるように、そこに何かを配置できるはずです。その場合、ActivityB はユーザーにメッセージを再度表示するか (onSaveInstanceState()メソッドに保存する必要があります)、ユーザーを ActivityA にリダイレクトして最初からやり直すことができます。

于 2012-11-23T23:08:23.820 に答える
1

私は同じ問題に遭遇しました。それがその方法なのか、そうする権利があるのか​​ はわかりませんが、Intent必要に応じてエクストラを変更しました.

intent.putExtra(SEARCH_EXTRA, false);
setIntent(intent);

したがって、必要なものを受け取っていないため、アクティビティは操作を実行しません。

于 2012-11-23T21:31:33.320 に答える
1

これは、アクティビティのライフサイクルで説明されている予想される動作です。

アクティビティが開始されると、常にIntentオブジェクトを受け取ります。アクティビティ B を開始するために使用されたインテントは、アクティビティが強制終了されたときに OS によって保持され、アクティビティが「ライブ」に戻ったときに再送信されます。

アクティビティがステータスを保持し、必要に応じて復元するかどうかはあなた次第です。問題の説明に基づいて、アクティビティのステータスとメッセージをonStop()保存して読み返すことをお勧めします。では、設定をクリアして、新しいクリーン サイクルを確実に開始する必要があります。SharedPreferencesonResume()onDestroy()

よろしく。

于 2012-11-23T21:06:52.487 に答える