web-dev-qa-db-ja.com

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

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は表示されたままです。

301
Martin

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);
finish(); // call this to finish the current activity
400
Jake Basile
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
138
diesel

関連するアクティビティのマニフェストファイルに追加することについてはどうでしょうか。

Android:noHistory="true"

bとCの活動定義に?それらはバックスタックに追加されません。それがあなたが望むものであるかどうかわからない。

73

これは長い間私を悩ませます。

フラグメントでは、

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

Activityで、(fragmentと比較してもう1つの意図フラグIntent.FLAG_ACTIVITY_CLEAR_TASKを追加します):

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);
56
Geng Jiawen
  1. アクティビティAのマニフェストのアクティビティ要素にAndroid:launchMode="singleTop"を追加します。
  2. その後、アクティビティAの起動時にintent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)を使用します。

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

28
Joseph Earl

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

25
Daniel Schuler

使ってみる

intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

ではなく

intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
14

あなたのアプリケーションが最小の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

9
Jaydeep purohit

Wakka のとおり 履歴スタックからアクティビティを削除する ...


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

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

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

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();
7
GeetT

FinishAffinity()を使用してください。タスクCを開始してバックスタック活動を消去するときは、タスクCで。

6
baswaraj

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

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

元の質問のコードは私にはうまく機能するように思われるため、私はここで答えを少し誤解を招くように思いましたか?

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

3
ianjoyner

Kotlinでは、Javaとほとんど同じです。 |記号のみがまたはのテキストに置き換えられます。だから、それはのように書かれています -

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK)
3
Exigente05
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.
3
Firzan Shaikh

私は役に立つかもしれない面白い解決策を見つけました。これを私のonBackPressed()メソッドで行いました。

finishAffinity();
finish();

FinishAffinityは既存のアクティビティのスタックへの接続を削除します。そして、Finishはあなたがその活動を終了するのを助けます。これは最終的にアプリケーションを終了します。

3
Sujith Royal

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

詳細については this documentationをチェックしてください。

2
Ashish Saini

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

AndroidマニフェストでActivity Aを使用して、[Android:launchMode="singleTop"]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
Tarun

startActivityForResult()を使ってActivity CからActivity Bを始める必要があるように思えます。 Activity Cのボタンをクリックしたら、setResult(RESULT_OK)finish()を呼び出して、Activity Cを終了します。 Activity Bでは、onActivityResult()自身もfinish()を呼び出すことで応答させることができます。そうするとActivity Aに戻ります。

2
Maximus

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

1
Abhijeet

この例を使用して、Activity Aから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
Vipin Yadav

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

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

0
binnyb

マニフェストで

Android:launchMode="singleTask"

そして

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

意図にNO History Flagを追加します。

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

Intent intent = new Intent(this, C.class);
intent.setFlags(intent.getFlags() | Intent.FLAG_ACTIVITY_NO_HISTORY); 
startActivity(intent);
finish();
0
Arun Sharma
 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
0

これは私が問題を解決した方法です:

private boolean clearHistoryBackStack = true;

@Override
public final void finish() {
    super.finish();

    if(clearHistoryBackStack)
        finishAffinity();
}
0
user2830808

このコードはkotlinで私のために働きます:

 val intent = Intent(this, MainActivity::class.Java)
 intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK)
 startActivity(intent)
 finish()
0

これをあなたのActivity BActivity Cに追加してください。

Android:noHistory="true"

またはOverrideonBackPressed関数は、returnによるバックプレスを回避します。

@Override
public void onBackPressed() {
   return;
}
0
Renjith JR

与えられたコードは正しく機能します。 Application Life Cycleサンプルを試しました。

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

0
Sathesh

コトリンの例:

      val intent = Intent(this@LoginActivity, MainActivity::class.Java)
      intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK
      startActivity(intent)
      finish()
0
stevyhacker

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

I tried "FLAG_ACTIVITY_CLEAR_TOP" and "FLAG_ACTIVITY_NEW_TASK"

しかし、それは私のために動作しません...私はこの解決策を使用することをお勧めしていませんが、あなたがこれを試すことができるよりもflagを設定できない場合

0

これはonBackPressedで私のために働きました:

public void onBackPressed()
{
    Intent intent = new Intent(ImageUploadActivity.this, InputDataActivity.class);

    Intent myIntent = new Intent(this, ImageUploadActivity.class);
    myIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(intent);
   finish();
}
0
PhilipS

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

Intent intent = new Intent(getApplicationContext(), yourActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
0
Pankaj Talaviya