54

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)

4

10 に答える 10

42

これはビットごとに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);
于 2010-12-02T19:09:45.177 に答える
36

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

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

于 2010-11-16T03:14:27.380 に答える
31

履歴スタックからのアクティビティの削除Wakkaに従って...


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

<activity android:name=".MyActivity"
    android:noHistory="true">
</activity>
于 2012-08-22T14:59:19.390 に答える
6

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

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
于 2012-03-03T01:53:38.680 に答える
5

これにより、アクティビティ バック スタックがクリアされません。

上記のすべての回答に従った後でも、戻るボタンを押すと、アプリを閉じる前に最後のアクティビティが 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);
}

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

于 2013-07-16T09:31:29.770 に答える
3

フラグIntent.FLAG_ACTIVITY_CLEAR_TOPを設定しなかった非常によく似たケースで、設定はうまくいきました。Intent.FLAG_ACTIVITY_NEW_TASKせずに試しましたか?

于 2010-11-16T04:28:54.043 に答える
2

これは私にとってはうまくいきます:)

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

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

于 2012-12-17T11:06:03.173 に答える
1

これを試して

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);
于 2015-01-06T08:55:04.120 に答える
1
Intent intent  = new Intent(this, LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);        
startActivity(intent);

これを書き、注意してください:LoginActivity最初に Launcher として起動し、

ランチャーモードを作成すると、フラグがその目的を上書きされるため、を削除しlaunchermodeて試してみると、確実に取得できます

于 2012-05-21T17:36:43.297 に答える
0

このコードを使用してログイン アクティビティ (A) を起動すると、次のようになります。

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);

アクティビティはアクティビティのスタックにある必要があります。そうでない場合、このフラグは効果がありません。

Login アクティビティ (A) で finish() を使用すると、アクティビティ (B) を起動した後 (B から A に戻るのを避けるため)、アクティビティ A (Login) はスタックにありません。ログイン アクティビティに属性として「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);
}
于 2014-07-25T11:14:04.437 に答える