142

プロファイルアクティビティの[ログアウト]ボタンをクリックしているときに、ユーザーをログインページに移動させたいのですが、そこでユーザーは新しい資格情報を使用する必要があります。

したがって、私はこのコードを使用しました:

Intent intent = new Intent(ProfileActivity.this,
        LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

onButtonClickログアウトボタンの。

しかし、問題は、ログインアクティビティでデバイスの戻るボタンをクリックすると、ProfileActivityに移動することです。LoginActivityのデバイスの戻るボタンを押すと、アプリケーションが閉じるはずだと思っていました。

私は何が間違っているのですか?

LoginActivityandroid:launchMode="singleTop"のマニフェストにも追加しました

ありがとうございました

4

18 に答える 18

357

ここで提案された解決策は私にとってはうまくいきました:

ジャワ

Intent i = new Intent(OldActivity.this, NewActivity.class);
// set the new task and clear flags
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(i);

コトリン

val i = Intent(this, NewActivity::class.java)
// set the new task and clear flags
i.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
startActivity(i)

ただし、API レベル >= 11 が必要です。

于 2014-06-13T12:33:11.473 に答える
31

ログアウト ボタンを使用するときにアプリケーションのすべてのアクティビティをクリアする 1 つの解決策を次に示します。

アクティビティを開始するたびに、次のように開始します。

Intent myIntent = new Intent(getBaseContext(), YourNewActivity.class);
startActivityForResult(myIntent, 0);

アプリ全体を閉じたい場合は、次のようにします。

setResult(RESULT_CLOSE_ALL);
finish();

RESULT_CLOSE_ALL は、すべてのアクティビティを閉じる必要があることを知らせる一意の整数を持つ最終的なグローバル変数です。

次に、すべてのアクティビティのコールバックを定義してonActivityResult(...)、アクティビティが RESULT_CLOSE_ALL 値で返されたときに、以下も呼び出すようにしますfinish()

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch(resultCode)
    {
    case RESULT_CLOSE_ALL:
        setResult(RESULT_CLOSE_ALL);
        finish();
    }
    super.onActivityResult(requestCode, resultCode, data);
}

これにより、すべてのアクティビティが閉じられるカスケード効果が発生します。

ただし、これはハックであり、使用startActivityForResultするように設計されていない方法で使用されます。

おそらく、これを行うためのより良い方法は、次に示すようにブロードキャスト レシーバーを使用することです。

ログアウト時にアクティビティ履歴スタックをクリアし、「戻る」ボタンでログインのみのアクティビティが開かないようにします

他の方法については、次のスレッドも参照してください。

Android: バックスタックをクリアする

以前の活動をすべて終了する

于 2012-10-18T08:20:24.703 に答える
23

アクティビティ スタックを完全にクリアするには、TaskStackBuilder を使用して新しいタスク スタックを作成します。次に例を示します。

Intent loginIntent = LoginActivity.getIntent(context);
TaskStackBuilder.create(context).addNextIntentWithParentStack(loginIntent).startActivities();

これにより、新しいクリーンなタスク スタックが作成されるだけでなく、LoginActivity に親アクティビティがある場合に「アップ」ボタンが適切に機能するようになります。

于 2014-09-08T04:56:40.833 に答える
6

あなたは試すことができますfinishAffinity()、それは現在のすべての活動を閉じ、Android 4.1以上で動作します

于 2015-07-11T11:54:40.283 に答える
5

私が提案できる解決策の 1 つは、私のProfileActivityandroid:launchMode="singleTop"のマニフェストに追加することです。ログアウトをクリックすると、ログインアクティビティからログオフできます ログアウト時にこれを呼び出すことができます。

Intent in = new Intent(Profile.this,Login.class);
                in.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivity(in);
                finish();
于 2012-10-18T06:04:32.537 に答える
2

私も同じ問題に直面しています..

ログインアクティビティで私がしていることは。

    Intent myIntent = new Intent(MainActivity.this, ActivityLoggedIn.class);
    finish();
    MainActivity.this.startActivity(myIntent);  

ログアウト時

   Intent myIntent = new Intent(ActivityLoggedIn.this, MainActivity.class);
   finish();
   ActivityLoggedIn.this.startActivity(myIntent);

これはうまくいきますが、私がActivityLoggedInにいて、アプリを最小化してアプリドロワーのランチャーボタンアイコンをクリックすると、MainActivityが再び開始されます:-/フラグを使用しています

android:LaunchMode:singleTask 

MainActivity 用。

于 2014-01-17T10:38:21.940 に答える
2

インテントフラグはどれも機能しませんでしたが、これが私が修正した方法です:

ユーザーが 1 つのアクティビティからサインアウトすると、そのアクティビティからメッセージをブロードキャストし、終了したいアクティビティでメッセージを受信して​​から、finish(); を呼び出す必要がありました。そしてそれはかなりうまく機能します。

于 2017-01-09T09:06:39.533 に答える
1

ただ保つ

Intent intent = new Intent(ProfileActivity.this,
    LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
startActivity(intent);
于 2012-10-18T06:07:55.237 に答える
1

API レベル 11 以降では、Intent でフラグを使用FLAG_ACTIVITY_CLEAR_TASKしてFLAG_ACTIVITY_NEW_TASK、すべてのアクティビティ スタックをクリアします。

Intent i = new Intent(OldActivity.this, NewActivity.class);
// set the new task and clear flags
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |  Intent.FLAG_ACTIVITY_CLEAR_TASK)
startActivity(i);
于 2015-07-03T11:04:16.603 に答える
1

高度で再利用可能な Kotlin:

セッターメソッドを使用して、フラグを直接設定できます。Kotlin では、Java のビットごとの oror代わり|になります。

intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK

これを定期的に使用する予定がある場合は、Intent 拡張関数を作成します

fun Intent.clearStack() {
    flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
}

その後、インテントを開始する前にこの関数を直接呼び出すことができます

intent.clearStack()

他の状況で追加のフラグを追加するオプションが必要な場合は、オプションのパラメーターを拡張関数に追加します。

fun Intent.clearStack(additionalFlags: Int = 0) {
    flags = additionalFlags or Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
}
于 2020-01-09T18:34:46.170 に答える
-1

これを使って

Intent i1=new Intent(getApplicationContext(),StartUp_Page.class);
i1.setAction(Intent.ACTION_MAIN);
i1.addCategory(Intent.CATEGORY_HOME);
i1.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i1.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
i1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(i1);
finish();
于 2015-06-12T06:33:06.703 に答える