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);
_
私も彼ら一人一人で試しました。
また、別のStackOverflowの質問を読んで、finish()
の後にstartActivity(intent)
を呼び出してみました。
ログインアクティビティで、戻るボタンをオーバーライドして、アクティビティを終了する代わりにアプリを非表示にします。
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
moveTaskToBack(true);
return true;
}
return super.onKeyDown(keyCode, event);
}
また、ルートアクティビティでAndroid:alwaysRetainTaskState = "true"を設定するようにしてください。したがって、ユーザーから30分間非アクティブな場合、Androidはスタック(ログインアクティビティを含む)をクリアしません。
次に、ログインに成功したらfinish()を呼び出します。
これはビット単位でORする必要があります。そうしないと、以前のフラグが上書きされてしまいます。
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);
Wakka in 履歴スタックからアクティビティを削除する ...
Android:noHistory="true"
の<activity>
にAndroidManifest.xml
属性を追加するには、次のようにします。
<activity Android:name=".MyActivity"
Android:noHistory="true">
</activity>
Android API 11
以上を使用している場合、次のコードを使用してスタックをクリアできます。
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
これはアクティビティバックスタックをクリアしません。
上記のすべての答えに従った後でも、戻るボタンを押すと、アプリを閉じる前に最後のアクティビティが表示されました。
これは私がやったことです:
@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は私のルートアクティビティです。
スタックの開始アクティビティEを呼び出すと、アクティビティA-> B-> C-> Dがあります。
私はそれが良いかどうかわかりません:)が動作します。
Intent intent = new Intent(this, LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
これを書き、注:LoginActivity
を最初にLauncherとして起動し、
ランチャーモードを記述した場合、フラグはその目的を上書きするため、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(ログイン)はスタックにありません。ログインアクティビティの属性に「noHistory」がある場合もまったく同じことが起こります。
だから、私にとっての解決策は、他の応答の組み合わせでした:
ログインアクティビティに戻らないようにするために、このコードはアクティビティ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);
}