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は表示されたままです。
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
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
関連するアクティビティのマニフェストファイルに追加することについてはどうでしょうか。
Android:noHistory="true"
bとCの活動定義に?それらはバックスタックに追加されません。それがあなたが望むものであるかどうかわからない。
これは長い間私を悩ませます。
フラグメントでは、
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);
Android:launchMode="singleTop"
を追加します。intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
とintent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
を使用します。つまり、アクティビティAが起動されると、その上にあるすべてのタスクがクリアされ、Aがトップになります。 Aをルートにして新しいバックスタックが作成され、singleTop
を使用すると、Aを一度だけ起動することが保証されます(Aは現在..._CLEAR_TOP
のためトップにあるため)。
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
使ってみる
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
ではなく
intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
あなたのアプリケーションが最小の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
Wakka のとおり 履歴スタックからアクティビティを削除する ...
次のようにAndroid:noHistory="true"
の<activity>
にAndroidManifest.xml
属性を追加します。
<activity Android:name=".MyActivity"
Android:noHistory="true">
</activity>
将来の研究のために、このコードを試してください。
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();
FinishAffinity()を使用してください。タスクCを開始してバックスタック活動を消去するときは、タスクCで。
このコードを使用して新しいアクティビティを開始し、他のすべてのアクティビティスタックまたはバックスタックを閉じるか破棄します...
Intent intent = new Intent(this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
元の質問のコードは私にはうまく機能するように思われるため、私はここで答えを少し誤解を招くように思いましたか?
Aがルートアクティビティであるため、FLAG_ACTIVITY_CLEAR_TOPのみを使用してBまたはCから起動すると、バックスタックからBとCが削除されます。
Kotlinでは、Javaとほとんど同じです。 |記号のみがまたはのテキストに置き換えられます。だから、それはのように書かれています -
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK)
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.
私は役に立つかもしれない面白い解決策を見つけました。これを私のonBackPressed()
メソッドで行いました。
finishAffinity();
finish();
FinishAffinity
は既存のアクティビティのスタックへの接続を削除します。そして、Finishはあなたがその活動を終了するのを助けます。これは最終的にアプリケーションを終了します。
この場合、Intent.FLAG_ACTIVITY_CLEAR_TOP
は機能しません。 (Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK)
を使用してください
詳細については this documentationをチェックしてください。
私はすべての解決策を試しましたが、どれも私のために個別に機能しませんでした。私の解決策は:
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();
startActivityForResult()
を使ってActivity C
からActivity B
を始める必要があるように思えます。 Activity C
のボタンをクリックしたら、setResult(RESULT_OK)
とfinish()
を呼び出して、Activity C
を終了します。 Activity B
では、onActivityResult()
自身もfinish()
を呼び出すことで応答させることができます。そうするとActivity A
に戻ります。
logout.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); logout.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
この例を使用して、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);
FLAG_ACTIVITY_CLEAR_TOP
に加えて、Intent.FLAG_ACTIVITY_SINGLE_TOP
を追加してみることもできます。
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
マニフェストで
Android:launchMode="singleTask"
そして
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
意図にNO History Flagを追加します。
アクティビティBで、以下のようにアクティビティCを開始します。>>>>>>
Intent intent = new Intent(this, C.class);
intent.setFlags(intent.getFlags() | Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(intent);
finish();
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
これは私が問題を解決した方法です:
private boolean clearHistoryBackStack = true;
@Override
public final void finish() {
super.finish();
if(clearHistoryBackStack)
finishAffinity();
}
このコードは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()
これをあなたのActivity B
とActivity C
に追加してください。
Android:noHistory="true"
またはOverride
onBackPressed
関数は、return
によるバックプレスを回避します。
@Override
public void onBackPressed() {
return;
}
与えられたコードは正しく機能します。 Application Life Cycleサンプルを試しました。
FLAG_ACTIVITY_CLEAR_TOPフラグを使用してアクティビティAを開始した後、バックスタックにBとCがありません。
コトリンの例:
val intent = Intent(this@LoginActivity, MainActivity::class.Java)
intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK
startActivity(intent)
finish()
私は新しい意図を始めた後にactivity_name.this.finish()
を呼び出しました、そしてそれは私のために働きました。
I tried "FLAG_ACTIVITY_CLEAR_TOP" and "FLAG_ACTIVITY_NEW_TASK"
しかし、それは私のために動作しません...私はこの解決策を使用することをお勧めしていませんが、あなたがこれを試すことができるよりもflagを設定できない場合
これは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();
}
裏面をクリアにするにはsetFlags()メソッドを使用してすべてのアクティビティを閉じて開始しますyourActvity
Intent intent = new Intent(getApplicationContext(), yourActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);