開始すると、インターネットから画像を読み込むアクティビティを取得しました。メモリを節約するために、[戻る]ボタンが押されてアクティビティが終了したときに、アクティビティにすべてのデータをダンプさせます。つまり、その中にあるすべての文字列と画像を取り除きます。これを行う最善の方法は、アクティビティを強制終了することだと考えました。
さて、[戻る]ボタンが押されたときのコールバックがわからないようです。そのため、タスクにonPause()
およびonStop()
コールバックを使用しようとしましたが、どちらの方法でもアプリを強制終了します。コードは次のとおりです。
public void onPause() {
this.finish();
}
public void onStop() {
finish();
}
これについて複数のバリエーションを試しましたが、どれも機能していないようです。何か案は?
これをアクティビティに追加します
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
if ((keyCode == KeyEvent.KEYCODE_BACK))
{
finish();
}
return super.onKeyDown(keyCode, event);
}
OnBackPressedメソッドの単純なオーバーライド:
@Override
public void onBackPressed() {
super.onBackPressed();
this.finish();
}
public boolean onKeyDown(int keycode, KeyEvent event) {
if (keycode == KeyEvent.KEYCODE_BACK) {
moveTaskToBack(true);
}
return super.onKeyDown(keycode, event);
}
上記のコードでアプリが終了しました。
まず、finish()
はプロセスを破壊せず、メモリを解放しません。アクティビティスタックからアクティビティを削除するだけです。プロセスを強制終了する必要がありますが、これは一連の質問で回答されます(これは何度も尋ねられるためです)。
しかし、適切な答えは-しないでください。Android OSは、メモリが必要なときに自動的にメモリを解放します。メモリを解放しないことで、ユーザーがそれに戻った場合にアプリがより速く起動します。
こちらをご覧ください トピックに関する優れた記事をご覧ください。
さて、アプリケーションのライフサイクルがどのように機能するかの構造を調べると、 here 、別のアクティビティがフォーカスを取得するとonPause()
が呼び出され、onStop()
は、アクティビティが表示されなくなったときに呼び出されます。
私がまだ学んだことから、アクティブである、および/またはフォーカスがあるアクティビティからのみfinish()
を呼び出すことができます。 finish()
メソッドからonPause()
を呼び出している場合、アクティビティがアクティブでなくなったときに呼び出していることを意味します。したがって、例外がスローされます。
finish()
をonStop()
から呼び出している場合、アクティビティはバックグラウンドに送信されているため、表示されなくなり、この例外が発生します。
back
ボタンを押すと、onStop()
が呼び出されます。
ほとんどの場合、Androidは、あなたが現在やりたいことを自動的に行います。