web-dev-qa-db-ja.com

以前の活動をすべて終了する

私のアプリケーションには以下のフロースクリーンがあります。

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を試みました。私はまた、スタックオーバーフローの中でいくつかの答えを調べますが、問題を解決することができません。私のアプリケーションはAndroid 1.6上にあるのでFLAG_ACTIVITY_CLEAR_TASKを使うことができません

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

330
Tanmay Mandal

つかいます:

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

これは家の上にすべての活動をクリアします。

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

よくわかりませんが、このフラグを使ってログインしようとすることもできます。その場合のアクティビティの順序がわかりません。それで、それがあなたが現在いるものを含むあなたがいるスクリーンの下のものをクリアするかどうか知らないでください、しかしそれは間違いなく行く道です。

お役に立てれば。

490
DArkO

あなたはIntent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASKを試すことができます。以前のアクティビティをすべてクリアし、新しいアクティビティを開始します。

288
Kong Ken

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

finishAffinity();

Androidの以前のバージョンで動作させたい場合は、

ActivityCompat.finishAffinity(this);
119
Henrique

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

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

上記のコードはLoginActivityを除くすべてのアクティビティをクリアします。それからLoginActivityが再作成され 'EXIT'シグナルが渡された時を待つためにLoginActivityonCreate(...)の中に次のコードを入れてください:

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

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

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

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

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

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

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

31
Gem

活動には以下を使用

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

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

私はこれが何人かの人々に役立つかもしれないと思います。

28
Aristo Michael

developer.Android.com :から

public void finishAffinity ()

APIレベル16で追加

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

この終了で前のアクティビティに結果を配信することはできません。そのようにしようとしている場合は例外がスローされます。

20
gmrl

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

API 16以降の場合は、

finishAffinity();

16未満の場合は、

ActivityCompat.finishAffinity(YourActivity.this);

それが役に立てば幸い!

15
Akshay Taru

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

13
Jaydeep purohit

ちょっとしたメモ、知っておくと良い
この答えはうまくいきます( 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);
11
John

アプリの最後の画面のログアウトボタンの場合は、ログアウトボタンのリスナーでこのコードを使用して、開いている過去のアクティビティをすべて終了すると、問題は解決します。

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

私がこれのために実装した解決策(私は私がどこかにStack Overflowでそれを見つけたと思う、しかし私は覚えていない、それで最初にそれをした人のおかげで):

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

// 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);
}
10
Andy

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

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

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

Android API 17

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

finish()を使う代わりにfinishAffinity();を使うだけです

6
Hitesh Kushwah

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);
6
Kamal Bunkar

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

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

StartActivity(ログイン)
FLAG_ACTIVITY_CLEAR_TOP
6
Plamen Nikolov

以前のアクティビティでstartActivityForResult()を使用している場合は、すべてのアクティビティでOnActivityResult()をオーバーライドしてその中のfinish();メソッドを呼び出すだけです。

5
ngesh

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

finishAffinity()
startHomeActivity()

それが役に立つことを願っています。

3
Djek-Grif

ユーザーがログアウトボタンをクリックしたら、次のコードを書きます。

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

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

3
nikki

単にログイン画面から行ったときではなく、ログイン画面から行ったときだけです。

そして、すべての今後のアクティビティで、これをログアウトに使用します。

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

それは完璧に機能します。

2
Asad Rao

私はこのようにして見つけました、それはすべての歴史をクリアして終了します

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
pirooz jenabi

ユーザーをscreen 1でログインし、そこから他の画面に移動した場合は、次のコマンドを使用します。

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

私はこの解決策がAPIレベルにもかかわらずすべてのデバイスで機能することを確認しました(11未満でさえ)。

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