web-dev-qa-db-ja.com

Android:バックスタックから以前のアクティビティをすべて削除します

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

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

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でデバイスの戻るボタンを押すと、アプリケーションが閉じるはずです。

何が間違っていますか?

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

ありがとうございました

100
Archie.bpgc

提案された解決策 ここ 私のために働いた:

Java

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(OldActivity.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)


ただし、11以上のAPIレベルが必要です。

262
kgiannakakis

ログアウトボタンを使用すると、アプリケーションのすべてのアクティビティをクリアする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:バックスタックをクリアする

以前のすべてのアクティビティを終了する

31
Anup Cowkur

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

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

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

17
Matt Accola

finishAffinity()はAPI 16に追加されました。以前のバージョンではActivityCompat.finishAffinity()を使用してください。インテントを使用してアクティビティを起動し、現在のアクティビティを終了するとき。 ActivityCompat.finishAffinity()の代わりにfinish()を使用します。現在のアクティビティより下のすべてのスタックアクティビティを終了します。それは私のためにうまく機能します。

14

私のために働いたもの

Intent intent = new Intent(getApplicationContext(), HomeActivity.class);
ComponentName cn = intent.getComponent();
Intent mainIntent = IntentCompat.makeRestartActivityTask(cn);
startActivity(mainIntent);
10
Mongi Zaidi

API 11以降では、次のようにIntent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASKを使用できます。

Intent intent = new Intent(this, MyActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK);
this.startActivity(intent);

以前のすべてのアクティビティを完全にクリアし、新しいアクティビティを開始します。

5
madx

私が提案できる解決策の1つは、私のProfileActivityのマニフェストにAndroid:launchMode="singleTop"を追加することです。ログアウトがクリックされると、u logoff再び開始しますLoginActivity。ログアウトu canこれを呼び出します。

Intent in = new Intent(Profile.this,Login.class);
                in.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivity(in);
                finish();
4
Android

finishAffinity()を試すことができます。現在のすべてのアクティビティが閉じられ、Android 4.1以降で動作します

4
Bunny

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

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

    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の場合

2
Sujal Mandal

activityには次を使用します

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);

remove CLEAR_TASKフラグメント使用のフラグ。

これが何人かの人々に役立つことを願っています。

2
Aristo Michael

これを試してみてください:

Intent logout_intent = new Intent(DashboardActivity.this, LoginActivity.class);
logout_intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
logout_intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
logout_intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(logout_intent);
finish();
1
Mohammad

ただ保つ

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

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);
1
S.Sathya Priya

どのインテントフラグも機能しませんでしたが、次のように修正しました。

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

1
Ian Wambai

これを使用

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();
0
Prashant Kumar