以前のすべてのアクティビティを完了します


368

私のアプリケーションには次のフロー画面があります。

Home->screen 1->screen 2->screen 3->screen 4->screen 5

今、私はlog out 各画面に共通のボタンがあります

Home/ screen 1 / screen 2 /screen 3/ screen 4 / screen 5

ユーザーが(任意の画面から)ログアウトボタンをクリックすると、すべての画面が終了し、新しい画面Log inが開きます。

私はFLAG_ACTIVITYこれを達成するためにほぼすべてを試みました。私はまた、stackoverflowでいくつかの回答を調べましたが、問題を解決できませんでした。私のアプリケーションはAndroid 1.6上にあるため、使用できませんFLAG_ACTIVITY_CLEAR_TASK

問題を解決する方法はありますか?


startActivityForResultを使用してネストされたアクティビティを実行しますか?
木質の多い'13年

いいえ。すべてのアクティビティはstartActivityで開始されます。
タンメイマンダル2013

ネストされたアクティビティでcodがfinishaffinitytask()を実行しているときに、ネストされたアクティビティを使用しています。それは行動を変えますか?finishaffinitytaskの実行時に結果ResultInfoの配信に失敗することがあるので。
Ripal Tamboli、2015年

この回答を確認してください、それはきっとあなたを助けるでしょうstackoverflow.com/a/25159180/2732632
Kimmi Dhingra

3
Android 21ではActivity.finishAndRemoveTask()が導入されました。
ジョセフジョンソン

回答:


543

使用する:

Intent intent = new Intent(getApplicationContext(), Home.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

これにより、家の上のすべてのアクティビティがクリアされます。

ユーザーがログインしてホームが作成されたときにログイン画面を終了すると想定し、その後、その上にある1から5までのすべての画面を表示します。私が投稿したコードは、他のすべてのアクティビティを終了するホーム画面に戻ります。インテントにエクストラを追加し、ホーム画面のアクティビティでそれを読んで、それを終了することもできます(ログイン画面をそこからもう一度起動するなど)。

わかりませんが、このフラグでログインしてみることもできます。その場合、アクティビティがどのように順序付けられるのかわかりません。そのため、現在表示している画面を含め、画面の下に表示されている画面がクリアされるかどうかはわかりませんが、間違いなくその方法です。

お役に立てれば。


ユーザーが最初の画面をホーム画面として表示している、それが主な問題です。
タンメイマンダル2013

それに、ホーム画面に戻ってそれを完了するために必要な私の応答があります。したがって、プロセスは任意の画面から上記のインテントを呼び出します。ホーム画面でインテントを受け取り、すぐにログインに向けてインテントを起動し、startActivityメソッドの後でホームを終了します。トランジションが表示されないように、インとアウトで保留中のアニメーションをnullにオーバーライドすることもできます(これは少し速く感じられるのでそれを行います)。
DArkO

10
アクティビティをとして宣言するのではなく、インテントのフラグとしてsingleInstance使用することFLAG_ACTIVITY_CLEAR_TOP|FLAG_ACTIVITY_SINGLE_TOPを検討してください。これにより、介在するアクティビティが終了し、目的のアクティビティが開始されます(またはフォアグラウンドに戻ります)。
CommonsWare

13
@ CommonsWareアクティビティに追加intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP);しても役に立たなかった。途中のアクティビティが完了しなかった。ログイン画面から戻ると、前のアクティビティが表示されているIntent intent=new Intent(BaseActivity.this, Login.class);intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP);startActivity(intent);。これが私のコードです。
Tanmay Mandal

26
このコードは、すべてのアクティビティをクリアするために、最上位のアクティビティスタックのみをクリアしますintent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);
Ajay Venugopal

318

試してみてくださいIntent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK。以前のすべてのアクティビティを完全にクリアし、新しいアクティビティを開始します。


11
適切な解決策、ただしAPI 11+のみ
riwnodennyk

メインのアクティビティを表示するときに遅延を引き起こさないので、この追加のフラグを使用することになりました(再起動しないので、はるかに高速です)。
マウリツィオ2014年

2
@riwnodennykなぜAPI 11+ですか?
Muhammad Babar 2014

17
11より前のバージョンには、IntentCompat.FLAG_ACTIVITY_CLEAR_TASKを使用してください
Steven Pena 14

2
@onoはい。それで十分です。ターゲットアクティビティの起動モードがマニフェストで「singleTask」として設定されていることを確認してください。
Steven Pena

137

新しいアクティビティを起動する前に、次のコードを追加するだけです。

finishAffinity();

または、以前のバージョンのAndroidで機能させる場合:

ActivityCompat.finishAffinity(this);

12
ActivityCompat.finishAffinity(this); api <16のactivity.finish()を呼び出します。そのため、機能しません。
Aamir Abro 2014年

1
@Beto Caldas、私は自分でソースコードを確認しました。AamirAbroが言及したように、API <16では機能しません。それはあなたがAPI <16で渡すアクティビティを完了するだけです
HendraWD

39

ユーザーが開いているすべてのアクティビティを終了する場合は、アプリケーションの起動時に実行される最初のアクティビティをロードするボタンを押し、他のすべてのアクティビティをクリアしてから、残りの最後のアクティビティを終了する必要があります。ユーザーが終了ボタンを押したときに次のコードを実行します。私の場合、LoginActivityプログラムで実行する最初のアクティビティです。

Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("EXIT", true);
startActivity(intent);

上記のコードは、を除くすべてのアクティビティをクリアしますLoginActivity。そして、次のコードを内部に入れたLoginActivityonCreate(...)ときをリッスンするために、LoginActivityEXIT 『信号を通過させた再作成され、』:

if (getIntent().getBooleanExtra("EXIT", false)) {
    finish();  
}

Androidで終了ボタンを作成するのが難しいのはなぜですか?

Androidは、使用するプログラムがバックグラウンドで実行されているかどうかをユーザーが気にする必要がないため、アプリケーションに「終了」ボタンを配置しないように努めています。

Android OSの開発者は、プログラムが予期せぬシャットダウンや電話の電源オフに耐えられるようにしたいと考えています。ユーザーがプログラムを再起動すると、中断したところから再開します。そのため、ユーザーはアプリケーションを使用しているときに電話を受けたり、アプリケーションを解放してリソースを増やす必要があるマップを開いたりすることができます。

ユーザーがアプリケーションを再開すると、中断することなく中断したところから再開します。この終了ボタンは、アクティビティマネージャーから電力を奪っており、自動的に管理されるAndroidプログラムのライフサイクルに問題を引き起こす可能性があります。


31
Intent intent = new Intent(this, classObject);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);

これはすべてのAndroidバージョンで機能します。IntentCompatクラスがAndroidサポートライブラリに追加された場所。


IntentCompat.FLAG_ACTIVITY_CLEAR_TASKは認識されません。のIntent代わりに使用してくださいIntentCompat
CoolMind 2018年

30

アクティビティには以下を使用します

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

フラグメントを使用するためにCLEAR_TASKフラグを削除します。

これが一部の人に役立つことを願っています。


24

私は遅れていると思いますが、簡単で短い答えがあります。Activityには、現在のアクティビティとすべての親アクティビティを終了するfinishAffinity()メソッドがありますが、これはAndroid 4.1以降でのみ機能します。

API 16以降の場合は、

finishAffinity();

16歳未満の場合は、

ActivityCompat.finishAffinity(YourActivity.this);

それが役に立てば幸い!


21

developer.android.comから:

public void finishAffinity ()

APIレベル16で追加

このアクティビティと、現在のタスクで同じアフィニティを持つそのすぐ下のすべてのアクティビティを終了します。これは通常、アプリケーションが別のタスク(アプリケーションが理解するコンテンツタイプのACTION_VIEWからなど)で起動でき、ユーザーが上ナビゲーションを使用して現在のタスクから独自のタスクに切り替えたときに使用されます。この場合、ユーザーが2番目のアプリケーションの他のアクティビティに移動した場合、それらすべてをタスクスイッチの一部として元のタスクから削除する必要があります。

このフィニッシュでは、前のアクティビティに結果を配信できず、そうしようとすると例外がスローされることに注意してください。


19

余談ですが、知っておくと便利です
この回答は機能します(https://stackoverflow.com/a/13468685/7034327

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

これは機能しませんが

Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

.setFlags() 以前のフラグ置き換え、新しいフラグを追加しません.addFlags()

これも機能します

Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

setFlagとaddFlagの違いについてのすばらしい説明、ありがとう
Pelanes

13

アプリケーションの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


10

私がこれのために実装した解決策(スタックオーバーフローでどこかで見つけたと思いますが、覚えていません。そもそもそうした人に感謝します):

あなたの活動のいずれかからこれを行います:

// Clear your session, remove preferences, etc.
Intent intent  = new Intent(getBaseContext(), LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

次に、LoginActivityで、onKeyDownを上書きします。

public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        moveTaskToBack(true);
        return true;
    }
    return super.onKeyDown(keyCode, event);
}

3
それは通常非常に悪い考えです、それが機能するかもしれません、それは将来壊れるかもしれないし、デバッグするのが難しいでしょう連絡先を紹介します。経験からお伝えします:)
マルティン・マルコンチーニ、2013年

10

アプリの最後の画面にあるログアウトボタンについては、ログアウトボタンリスナーでこのコードを使用して、開いている以前のすべてのアクティビティを完了してください。これで問題は解決しました。

{
Intent intent = new Intent(this, loginScreen.class);
ntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
}

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

6
なぜFLAG_ACTIVITY_CLEAR_TASKを 2回するのですか?
Choletski、2015年

1
私の理解から、.setFlagsは以前のフラグを置き換え、フラグを追加しません。.addFlagsは、私が使用すると思いますか?上記のすべてのコードを引き起こしますi1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); が一掃される
iOSAndroidWindowsMo​​bileAppsDev 2016年

addFlagsは私のために働く
Jamil

1
setFlags以前のすべてsetFlagsを置き換えます。したがって、last のみが有効であり、previousが置き換えられます。そのため、電話をかける必要はありませんi1.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); i1.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
mtrakal

8

私はあなたが使うことができる同じ問題をIntentCompatこのように持っています:

import android.support.v4.content.IntentCompat;
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);

このコードは私のために働きます。

Android API 17


8

私の場合、私finishAffinity()は最後のアクティビティで関数を使用します:

finishAffinity()
startHomeActivity()

お役に立てれば幸いです。



6

ログイン->ホーム->画面1->画面2->画面3->画面4->画面5

画面4(またはその他)->

StartActivity(ログイン)
FLAG_ACTIVITY_CLEAR_TOP


2
戻るボタンを押すと、以前のすべてのアクティビティがそれらの順序で表示されます。これらのアクティビティは閉じる必要があります。ログアウトボタンをクリックすると、スタックにアクティビティが1つだけあり、それがログインアクティビティになります。ログイン画面。ユーザーはホーム画面から起動します。
Tanmay Mandal

6

API> = 15からAPI 23の単純なソリューション。

 Intent nextScreen = new Intent(currentActivity.this, MainActivity.class);
 nextScreen.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);
 startActivity(nextScreen);
 ActivityCompat.finishAffinity(currentActivity.this);

誰もがそれから利益を得ることができるようにあなたの答えを詳しく説明してください。
Shubhamoy、2016年

5

startActivityForResult()以前のアクティビティで使用している場合は、オーバーライドしてOnActivityResult()、その中のfinish();メソッドをすべてのアクティビティで呼び出します。これでジョブが実行されます...


いいえ、使用してstartActivityいます。
タンメイ・マンダル

onActivityResultそれぞれの活動を維持することは困難です。DArkOの提案を実装し、私の目標を達成し、助けに感謝します。
タンメイ・マンダル

3

ユーザーがログアウトボタンをクリックすると、次のコードが記述されます。

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

また、ログイン後に新しいアクティビティを呼び出す場合は、finish()を使用しないでください。


2

単に、ログイン画面を終了するときではなく、ログイン画面から移動するときです。

そして、すべてのフォワードアクティビティで、これをログアウトに使用します。

final Intent intent = new Intent(getBaseContext(), LoginScreen.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
context.startActivity(intent);

それは完全に動作します。


1

ユーザーをログインさせ、screen 1そこから他の画面に移動する場合は、

Intent intent = new Intent(this, Screen1.class);
intent.addFlags(FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

戻るボタンを押すと、以前のすべてのアクティビティがそれらの順序で表示されます。これらのアクティビティは閉じる必要があります。ログアウトボタンをクリックすると、スタックに1つのアクティビティのみがあり、それがログインアクティビティになります。
タンメイ・マンダル

この動作が必要な場合は、上記のように、アクティビティの1つ(ログインを除く)でonKeyDownand onBackPressed(またはonKeyDown、Androidバージョン<2.0をサポートする場合)をオーバーライドする必要がありますstartActivity(login)
Gabriel Negut

スタック内のすべてのアクティビティを終了するログイン画面に移動するボタンがあります。それは可能ですか?
タンメイマンダル

1

私はこの方法を見つけました、それはすべての履歴をクリアして終了します

Intent startMain = new Intent(Intent.ACTION_MAIN);
startMain.addCategory(Intent.CATEGORY_HOME);
startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(startMain);
Intent intent = new Intent(getApplicationContext(), SplashScreen.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

finish();
System.exit(0);

1

私は遅れていると思いますが、簡単で短い答えがあります。Activityには、現在のアクティビティとすべての親アクティビティを終了するfinishAffinity()メソッドがありますが、これはAndroid 4.1以降でのみ機能します。

API 16以降の場合は、

finishAffinity();

16歳未満の場合は、

ActivityCompat.finishAffinity(YourActivity.this);

それが役に立てば幸い!

シェアエディット作成5月27'18に8:03

アクシェイタル


0

この解決策は、APIレベルにもかかわらず(<11であっても)すべてのデバイスで機能することがわかりました

Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
ComponentName cn = intent.getComponent();
Intent mainIntent = IntentCompat.makeRestartActivityTask(cn);
startActivity(mainIntent);


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