内の任意の時点でログアウトできるアプリケーションがいくつかあります。たとえば、ログインしてからブラウジングします。アクションバーまたはメニューボタンを使用してログアウトします。その時点でfinish()を呼び出すことができますが、最後のアクティビティがポップされます。ユーザーをホームアクティビティに移動しても、スタックはメモリに残ります。残りのスタックを破壊する方法はありますか?
2 に答える
これを行う最も簡単な方法は、スタックをクリアしてホームまたは最初のアクティビティに戻し、アプリを終了するように指示する識別子を渡すことです。例えば:
public class ActivityOne extends Activity {
public static final String FINISH_THIS = "FINISH_THIS";
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
if(intent.hasExtra(FINISH_THIS)) {
finish();
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if(getIntent().hasExtra(FINISH_THIS)) {
finish();
}
}
}
public class ActivityTwo extends Activity {
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if(item.getItemId() == R.id.logout) {
Intent intent = new Intent(this, ActivityOne.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra(ActivityOne.FINISH_THIS, true);
startActivity(intent);
}
return true;
}
}
ActivityOne がスタックのルートであり、ActivityTwo がユーザーがログアウトするオプションを選択した場所である場合、ActivityOne に戻るインテントを開始すると、バックスタックが削除されます。ログアウト時にアプリを終了させたい場合は、FINISH_THIS で行ったように追加を渡して、ルート/ホーム アクティビティが終了することを知らせることができます。
これを行う別の方法は、 を呼び出すsetResult(FINISH_THIS)
前に FINISH_THIS が int 識別子である場所を呼び出すことfinish()
です。次に、スタック内の他のすべてのアクティビティで、結果をオーバーライドonActivityResult
してチェックし、そのアクティビティを終了する必要があるかどうかを確認します。その場合は、結果を再度設定し、それをそのまま渡し続けます。
最初に概説したインテント メソッドを使用することは、結果をデイジー チェーン接続することに依存しないため、スタックをクリアするための推奨される方法ですが、両方のオプションが十分に機能します。
それを行うための迅速で汚い方法は、onResume でまだログインしていることを確認し、ログインしていない場合は終了します。そうすれば、彼らが反撃した場合、それを開こうとするときに各アクティビティを閉じます。これにより、アクティビティが閉じられることが予想されるときに、誰かがアプリ マネージャーを使用してアクティビティを再入力することもできなくなります。
もう 1 つのアイデアはAndroid: Clear the back stack です。