アクティビティのAndroidスタックをクリアする方法は?
-
10-10-2019 - |
質問
Androidでいくつかのアクティビティを備えたアプリケーションがあり、メニューボタンを押してユーザーにログアウトできるようにしたいと考えています。私が抱えている問題はそれです
a)Androidでアプリケーションを終了させず、
b)ユーザーをに送信しても LoginActivity
繰り返しますが、彼らはいつでも押すことができます 戻る そして、彼らがいた以前の活動にすぐに戻ります。
私はすでに2つの次のフラグを使用してアクティビティを起動しようとしました。
Intent intent = new Intent(this, LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
また、それぞれを自分で試してみました。
私も電話をかけようとしました finish()
後 startActivity(intent)
別のStackOverFlowの質問で読んだように。
解決
ログインアクティビティでは、バックボタンをオーバーライドするため、アクティビティを完了する代わりにアプリを隠します。
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
moveTaskToBack(true);
return true;
}
return super.onKeyDown(keyCode, event);
}
また、Android:AlwaysRetaskState = "True"をルートアクティビティで必ず設定してください。そのため、Androidはユーザーから30分間の不活性度の後にスタック(ログインアクティビティを含む)をクリアしません。
次に、ログインが成功したら、finish()を呼び出します。
他のヒント
これはビットごとに行われるか、以前のフラグを上書きすることになります。
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
そのようです:
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
に従って ワッカ の 履歴スタックからアクティビティを削除します...
追加 android:noHistory="true"
あなたへの属性 <activity>
の中に AndroidManifest.xml
このような:
<activity android:name=".MyActivity"
android:noHistory="true">
</activity>
使用している場合 Android API 11
または、次のコードを使用してスタックをクリアできます。
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
これにより、アクティビティバックスタックがクリアできません。
上記のすべての回答に従った後でも、バックボタンを押すと、アプリを閉じる前に最後のアクティビティが1秒間表示されました。
これが私がしたことです:
@Override
public void onBackPressed() {
Intent startMain = new Intent(Intent.ACTION_MAIN);
startMain.addCategory(Intent.CATEGORY_HOME);
startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(startMain);
}
今、私のアプリはバックプレスで終了します:)手間なしで。
設定 Intent.FLAG_ACTIVITY_CLEAR_TOP
私が設定しなかった非常によく似たケースで私のために働いてきました Intent.FLAG_ACTIVITY_NEW_TASK
国旗。なしで試したことがありますか?
これは私のための仕事です:)
Intent main = new Intent(this, A_Activity.class);
main.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
| Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(main);
Intent tool = new Intent(this, B_Activity.class);
startActivity(tool);
finish();
ここで、たとえばAは私のルートアクティビティです
アクティビティがありますa-> b-> c-> dスタックでアクティビティeを開始するとき、私は今a-> eを持っています
私はそれが良いことを知りません:)しかしうまくいきます。
Intent intent = new Intent(this, LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
これを書いて注意してください: LoginActivity
最初にランチャーとして起動する必要があります
ランチャーモードを書いた場合、フラグは上書きされているため、削除してください launchermode
そして、あなたがきっとそれを手に入れることを試みてください
これを試して
Intent intent = new Intent(this, MainActivity.class);
intent.addFlags(
Intent.FLAG_ACTIVITY_CLEAR_TOP |
Intent.FLAG_ACTIVITY_CLEAR_TASK |
Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
このコードを使用してログインアクティビティを起動する場合(a):
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
アクティビティはアクティビティのスタックにある必要があります。そうしないと、このフラグには効果がありません。
ログインアクティビティ(a)でfinish()を使用する場合、アクティビティ(b)を起動した後(bからaに戻らないように)、アクティビティa(ログイン)はスタックにありません。ログインアクティビティが属性として「ノヒストリー」を持っている場合、まったく同じことが起こります。
ですから、私にとっての解決策は、他の反応の組み合わせでした。
このコードは、ログインアクティビティに戻ることを避けるために、アクティビティBに入ります。
@Override
public void onBackPressed() {
moveTaskToBack(true);
super.onBackPressed();
}
そして、このコードは、ログアウト関数を呼び出すアクティビティになります。
public static void logout() {
Intent intent = new Intent(activity, LoginMain.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
}