web-dev-qa-db-ja.com

Androidアクティビティのスタックをクリアするには?

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)を呼び出してみました。

53
Totic

ログインアクティビティで、戻るボタンをオーバーライドして、アクティビティを終了する代わりにアプリを非表示にします。

@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()を呼び出します。

35
Tenfour04

これはビット単位で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);
42
deweylewie

Wakka in 履歴スタックからアクティビティを削除する ...


Android:noHistory="true"<activity>AndroidManifest.xml属性を追加するには、次のようにします。

<activity Android:name=".MyActivity"
    Android:noHistory="true">
</activity>
31

Android API 11以上を使用している場合、次のコードを使用してスタックをクリアできます。

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
6
matangs

これはアクティビティバックスタックをクリアしません。

上記のすべての答えに従った後でも、戻るボタンを押すと、アプリを閉じる前に最後のアクティビティが表示されました。

これは私がやったことです:

@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);
}

今、私のアプリはバックプレスで終了します:)面倒なし。

5
amalBit

設定Intent.FLAG_ACTIVITY_CLEAR_TOPは、Intent.FLAG_ACTIVITY_NEW_TASKフラグ。なしで試しましたか?

3
Brandon

私のためのこの仕事:)

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があります。

私はそれが良いかどうかわかりません:)が動作します。

2
Dawid Drozd
Intent intent  = new Intent(this, LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);        
startActivity(intent);

これを書き、注:LoginActivityを最初にLauncherとして起動し、

ランチャーモードを記述した場合、フラグはその目的を上書きするため、launchermodeを削除して、確実に取得してください。

1
Anand Kumar

これを試して

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);
1
Raghavendra

このコードを使用してログインアクティビティを起動する場合(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);
}
0
Mario Velasco