406

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

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

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

4

27 に答える 27

585

使用する:

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

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

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

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

于 2011-06-13T12:33:52.000 に答える
336

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

于 2012-11-20T07:47:29.487 に答える
149

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

finishAffinity();

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

ActivityCompat.finishAffinity(this);
于 2014-07-29T13:11:05.367 に答える
39

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

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

上記のコードは、を除くすべてのアクティビティをクリアしますLoginActivity。次に、次のコードをLoginActivity「s」の中に入れて、が再作成されて「EXIT」信号が渡さonCreate(...)れたときをリッスンします。LoginActivity

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

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

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

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

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

于 2012-05-02T04:19:56.967 に答える
31
Intent intent = new Intent(this, classObject);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);

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

于 2014-05-23T08:16:56.097 に答える
30

活動には以下を使用してください

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

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

これが一部の人々に使用されることを願っています。

于 2015-03-05T10:54:17.427 に答える
21

developer.android.comから:

public void finishAffinity ()

API レベル 16 で追加

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

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

于 2012-11-28T12:04:39.513 に答える
15

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

于 2016-07-03T09:50:17.183 に答える
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);
}
于 2011-09-23T06:13:49.097 に答える
10

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

{
Intent intent = new Intent(this, loginScreen.class);
ntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
}
于 2013-11-26T10:44:47.847 に答える
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();
于 2015-06-12T06:15:08.110 に答える
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);
于 2016-11-04T17:52:23.003 に答える
6

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

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

StartActivity(ログイン)
FLAG_ACTIVITY_CLEAR_TOP

于 2011-06-13T12:19:59.070 に答える
5

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

于 2011-06-13T12:25:21.803 に答える
3

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

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

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

于 2012-03-28T11:48:42.000 に答える
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);
于 2016-12-10T19:03:32.140 に答える
1

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

Intent intent = new Intent(this, Screen1.class);
intent.addFlags(FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
于 2011-06-13T12:23:36.400 に答える
0

このソリューションは、API レベルに関係なく (11 未満の場合でも) すべてのデバイスで機能することがわかりました。

Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
ComponentName cn = intent.getComponent();
Intent mainIntent = IntentCompat.makeRestartActivityTask(cn);
startActivity(mainIntent);
于 2016-06-05T08:22:56.893 に答える