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


330

Androidでは、A、B、Cなどのアクティビティがあります。

Aでは、このコードを使用してBを開きます。

Intent intent = new Intent(this, B.class);
startActivity(intent);

Bでは、このコードを使用してCを開きます。

Intent intent = new Intent(this, C.class);
startActivity(intent);

ユーザーがCのボタンをタップしたら、Aに戻ってバックスタックをクリアします(BとCの両方を閉じます)。したがって、ユーザーが戻るボタンBとCを使用しても表示されない場合は、次のことを試しています。

Intent intent = new Intent(this, A.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
startActivity(intent);

しかし、アクティビティAに戻っているときに[戻る]ボタンを使用すると、BとCが引き続き表示されます。これを回避するにはどうすればよいですか?

回答:


438

FLAG_ACTIVITY_NEW_TASKのドキュメントに記載されているように追加してみてくださいFLAG_ACTIVITY_CLEAR_TOP

この起動モードは、FLAG_ACTIVITY_NEW_TASKと組み合わせて効果的に使用することもできます。タスクのルートアクティビティを開始するために使用すると、そのタスクの現在実行中のインスタンスがフォアグラウンドになり、ルート状態にクリアされます。これは、たとえば、通知マネージャーからアクティビティを起動するときに特に役立ちます。

したがって、起動Aするコードは次のようになります。

Intent intent = new Intent(this, A.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(intent);
CurrentActivity.this.finish(); // if the activity running has it's own context


// view.getContext().finish() for fragments etc.

28
おかげで、私はこれを試しました。それでもCが表示された後で[戻る]ボタンをタップすると、何が欠けているのでしょうか?
マーティン

4
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_NEW_TASK);
dzeikei

8
私はしかし、ソース活動に仕上げを()の呼び出しでは動作しません、私は達成するために必要なものを行います
2cupsOfTech

10
これが機能しないのと同じ問題がありました。私にとってそれを修正したのは、新しいアクティビティの開始後にfinish()を呼び出すことでした
Arno

20
また、もう1つ明確なIntent intent = new Intent(SingUpActivity.this、LoginActivity.class);を追加しました。intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent); finish();
サム

147
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);

8
CLEAR_TOPフラグに関しては、この組み合わせは、スタック全体を完全にクリアし、新しいアクティビティをアプリ内で唯一のものにした唯一の組み合わせです。ありがとうございました!
Aviel Gross 2015

8
これと受け入れられた答えの違いは何ですか?
Yuri Heupa 2015

7
おかげで、受け入れ答えとの違いは、このフラグを使用して、我々はactivity.finishを呼び出す必要がいけないということである
パブロCegarra

1
FLAG_ACTIVITY_CLEAR_TASKはNEW_TASKと完全に連動しました
Shamsul Arefin Sajib

1
これは受け入れられる答えになるはずです。どうもありがとうございました。
MDデンマーク語Ansari 2018

77

関連するアクティビティのマニフェストファイルを追加するのはどうですか?

android:noHistory="true"

BとCのアクティビティ定義に それらはバックスタックに追加されません。それがあなたが望むものかどうかはわかりません。


3
これを使用するときは十分注意してください-FBまたは同様の機能でログインを使用している場合
Skynet

2
@Skynetなんで?これを行うことに関連する問題は何ですか?
アルフィーウッドランド

8
nohistoryがtrueのページからログインするために制御をFBに渡すと、FBアプリがユーザーのログイン後にどこに着地するかがわかりません。私の場合、電話のホーム画面に戻っていて、仕事をほとんど失いました!
スカイネット2015年

これは、バックスタックに追加されたアクティビティを許可しません....これは正しいソリューションではありません。
Tarun

まさに私が探している
Masum

63

これは長い間私を悩ませました。最後に私はこれをすることでそれを解決しました:

フラグメントでは、以下を使用します。

Intent intent = new Intent(view.getContext(), A.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(intent);

アクティビティで使用します(Intent.FLAG_ACTIVITY_CLEAR_TASKフラグメントと比較してインテントフラグを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);

1
androidannotationsを使用している場合は、次を追加する必要があります:Intent.FLAG_ACTIVITY_CLEAR_TASK
yosafatade

活動ソルチオインは私にはうまくいきました。私はAPI 16を使用すると思いますが、Daniel Schulerのソリューションの方が簡単です。
PhilippS 2014

yosafatadeありがとう、それは私が欠けていたものでした!
Marty Miller

30
  1. android:launchMode="singleTop"アクティビティAのマニフェストのアクティビティ要素に追加します
  2. 次にintent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)アクティビティAを開始するときに使用します

つまり、アクティビティAが起動すると、その上にあるすべてのタスクがクリアされ、Aが上になります。ルートでAを使用して新しいバックスタックが作成されsingleTopます。これを使用すると、Aを1度だけ起動できます(Aはにより上部にあるため..._CLEAR_TOP)。


3
はい。これは私が現在使用しているものですが、それはそれを行いません。それでも、戻るボタンを押すとCが表示されます。
マーティン

奇妙なことに、私はそれをプロジェクトで使用しましたが、うまく動作します...戻るを押すと、ホーム画面に移動します。おそらく何か他のことが起こっているのでしょう。マニフェストを投稿してもらえますか?
ジョセフアール

エミュレータを再起動しましたが、今言ったように動作しているようです。あなたの助けをありがとう!
マーティン

singleTopは、スタックのクリアとは関係ありません。
stdout

29

API 16(Jelly Bean)以降では、を呼び出すだけfinishAffinity()です。

これActivityCompat.finishAffinity(Activity activity)で、互換性ライブラリを使用して呼び出すこともできます。

マニフェストのtaskAffinityを、そのアクティビティグループに固有のパッケージ名に設定してください。

詳細については、http//developer.android.com/reference/android/support/v4/app/ActivityCompat.html#finishAffinity%28android.app.Activity%29をご覧ください。


すでにAPI 16を使用している場合は、本当に使いやすくて簡単なソリューションです。
PhilippS 14

3
注意:これは、同じtaskAffinity名を共有するアクティビティでのみ機能します
Ryan

これは、履歴にアクティビティが1つしかない場合にのみ機能します。
16年


11

アプリケーションのSDKバージョンが16以上の場合は、finishAffinity()を使用できます。

このアクティビティと、現在のタスクで同じアフィニティを持つそのすぐ下のすべてのアクティビティを終了します。

これは私にとっての仕事ですトップペイメント画面ですべてのバックスタック活動を削除し

 @Override
public void onBackPressed() {
         finishAffinity();
        startActivity(new Intent(PaymentDoneActivity.this,Home.class));
    } 

http://developer.android.com/reference/android/app/Activity.html#finishAffinity%28%29



8

将来の研究のために、このコードを試してください。

Intent intent = new Intent(context, LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
finish();

これらのフラグは最終的に私のために働いた。私がしたことは、これらのフラグとブール値の追加のEXIT = trueを使用して、同じアクティビティを開始したことです。onCreate()で、EXITの起動パラメータを確認し、trueに設定されている場合はfinish()を呼び出しました。これは、自分のアプリを閉じるだけの面倒な作業です。
Janne Oksanen、

8

finishAffinity();を使用します。タスクAの開始時にタスクCでバックスタックアクティビティをクリアします。


この答えだけが私にとってうまくいきます。Intent.FLAG_ACTIVITY_CLEAR_TOPとIntent.FLAG_ACTIVITY_NEW_TASKは必要ありません
nuttynibbles

7

このコードを使用して新しいアクティビティを開始し、他のすべてのアクティビティスタックまたはバックスタックを閉じるか破棄します。

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

5
Use finishAffinity() to clear all backstack with existing one.

Suppose, Activities A, B and C are in stack, and finishAffinity(); is called in Activity C, 

    - Activity B will be finished / removing from stack.
    - Activity A will be finished / removing from stack.
    - Activity C will finished / removing from stack.

5

私は役立つかもしれない興味深い解決策を見つけました。私は自分のonBackPressed()方法でこれを行いました。

finishAffinity();
finish();

FinishAffinityスタックへの既存のアクティビティの接続を削除します。そして、finishはそのアクティビティを終了するのに役立ちます。最終的にはアプリケーションを終了します。


4

元の質問のコードが私にとってうまく機能しているように見えるので、私はここで答えが少し誤解を招くのを見つけましたか?

Aがルートアクティビティであるため、FLAG_ACTIVITY_CLEAR_TOPでのみBまたはCから開始すると、BとCがバックスタックから削除されます。


4

Kotlinでは、Javaとほぼ同じです。のみ| シンボルはまたはテキストに置き換えられます。だから、それは-

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK)

3

私はすべての解決策を試しましたが、どれも個別に機能しませんでした。私の解決策は:

Androidマニフェストでを使用して宣言Activity Aします。SingleTop[android:launchMode="singleTop"]

Aどこからでも起動しながら、次のフラグを追加します。スタックをクリアします。

Intent in = new Intent(mContext, A.class);
in.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK );
startActivity(in);
finish();

2

Intent.FLAG_ACTIVITY_CLEAR_TOPこの場合は機能しません。使ってください(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK)

詳細については、このドキュメントをご覧ください。


2

あなたが開始する必要があるようにそれは私に聞こえるActivity CからActivity B使用することによってstartActivityForResult()。あなたはのボタンをクリックするとActivity C、コール、setResult(RESULT_OK)およびfinish()ので、Activity C終了されます。ではActivity B、自分自身をonActivityResult()呼び出すことによっても応答することができ、finish()その後、に戻されActivity Aます。


7
はい。ただし、AとCの間に42のアクティビティがある場合、これはかなり退屈な作業になります。フラグFLAG_ACTIVITY_CLEAR_TOPは、OPが望むことを直接行うことになっています。
Guillaume Brunerie

これはOPが望むものを達成するための最適な方法ではなく、@ Guillaumeが言ったように、ルートとスタックのトップの間のすべてのアクティビティにコードが必要になります。
ジェイクバジル2011

正式に指摘した。これらは明らかに私が知る必要があるフラグです。
Maximus

1

logout.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); logout.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);


1

この例を使用してActivity Afrom を呼び出すことができますActivity C

Intent loout = new Intent(context, LoginActivity.class); loout.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); context.startActivity(loout);


1

私のために追加Intent.FLAG_ACTIVITY_CLEAR_TASKすると問題が解決しました

Intent i = new Intent(SettingsActivity.this, StartPage.class);
                i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP  | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
                startActivity(i);
finish();

1

高度で再利用可能なKotlin:

setterメソッドを使用してフラグを直接設定できます。Kotlinでorある代替のJavaビット単位のためか|

intent.flags = FLAG_ACTIVITY_NEW_TASK or 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
}

0

に加えてFLAG_ACTIVITY_CLEAR_TOP、次のものを追加することもできIntent.FLAG_ACTIVITY_SINGLE_TOPます。

intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);


これは、スタックのルートではなく、スタックの一番上のアクティビティにのみ影響します。
ジェイクバジル2011

0

指定されたコードは正しく動作します。Application Life Cycleサンプルで試しました。

フラグFLAG_ACTIVITY_CLEAR_TOPでアクティビティAを開始した後、バックスタックにBとCがありません


0

私はactivity_name.this.finish()新しい意図を始めた後に電話をかけました、そしてそれは私のために働きました。

I tried "FLAG_ACTIVITY_CLEAR_TOP" and "FLAG_ACTIVITY_NEW_TASK"

しかし、それは私にとってはうまくいきません...私はこのソリューションの使用を提案していませんが、フラグを設定してもうまくいかない場合は、これを試すことができます。


0

インテントに履歴フラグを追加しません。

アクティビティBで、アクティビティCを以下のように開始します>>>>>>

Intent intent = new Intent(this, C.class);
intent.setFlags(intent.getFlags() | Intent.FLAG_ACTIVITY_NO_HISTORY); 
startActivity(intent);
finish();

0

マニフェストに

android:launchMode="singleTask"

そして

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

0

これをあなたに追加するかActivity BActivity C

android:noHistory="true"

またはでOverride onBackPressedバックプレスを回避する機能return

@Override
public void onBackPressed() {
   return;
}

0

裏面をクリアするためにsetFlags()メソッドを使用してすべてのアクティビティを閉じ、yourActvityを開始します

Intent intent = new Intent(getApplicationContext(), yourActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.