私が理解しているように、アクティビティが破棄されることは、アクティビティが終了することと同等ではありません。
- 終了した
- 破壊されました
- Android OS は、目に見えないアクティビティを破棄してメモリを回復する場合があります。ユーザーがアクティビティに戻ると、アクティビティが再作成されます。
- ユーザーが画面を回転すると、アクティビティは破棄され、再作成されます。
- 参考:アクティビティの再作成
では、破棄されたアクティビティを終了するにはどうすればよいですか? finish()
メソッドにはオブジェクトが必要ですActivity
が、アクティビティが破棄された場合、オブジェクトがありませActivity
ん。破棄されたアクティビティへの参照を保持する必要はありませんか?
ケーススタディ:
私は activity を持っておりa
、それは を開始b
し、次にc
( を使用してActivity.startActivity()
) 開始するので、バックスタックは次のようになります。
a → b → c
ではc
、ユーザーがフォームに入力し、[送信] ボタンをタップします。を使用して、リモート サーバーに対してネットワーク要求が行われますAsyncTask
。タスクが完了したら、トーストを表示し、を呼び出してアクティビティを終了しc.finish()
ます。完全。
次のシナリオを検討してください。
非同期タスクの進行中に、ユーザーは別のアプリに切り替えます。その後、Android OS は、メモリの制約により、3 つのアクティビティ ( a
、b
、 ) をすべて破棄することを決定しました。c
その後、非同期タスクが完了します。どうすれば終了しc
ますか?
私が試したこと:
- 電話
c.finish()
:c
は破壊されているため、できません。
- 電話
b.finishActivity()
:b
は破壊されているため、できません。
と一緒に使用
Context.startActivity()
して、上FLAG_ACTIVITY_CLEAR_TOP
に上げb
て仕上げc
ます。// appContext is an application context, not an activity context (which I don't have) Intent intent = new Intent(appContext, B.class); // B is b's class. intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); appContext.startActivity(intent);
- 失敗し、
appContext.startActivity()
例外をスローします:
- 失敗し、
android.util.AndroidRuntimeException: アクティビティ コンテキストの外部から startActivity() を呼び出すには、FLAG_ACTIVITY_NEW_TASK フラグが必要です。これは本当にあなたが望むものですか?
編集: 明確化:非同期タスクが終了するまで待機し、c
サーバーの応答に基づいて終了するかどうかを決定する必要があります。