以前のすべてのアクティビティを終了します
-
27-10-2019 - |
質問
私のアプリケーションには、次のフロースクリーンがあります。
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でいくつかの答えを調べますが、問題を解決することはできません。私のアプリケーションはAndroid1.6にあるので、使用できません FLAG_ACTIVITY_CLEAR_TASK
問題を解決する方法はありますか?
解決
使用する:
Intent intent = new Intent(getApplicationContext(), Home.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
これにより、家の上のすべてのアクティビティがクリアされます。
ユーザーがログインして自宅が作成されたときにログイン画面を完了し、その後すべての画面が1〜5の画面が作成されたときに仮定します。私が投稿したコードは、他のすべてのアクティビティを完成させるホーム画面に戻ります。意図に追加を追加して、ホーム画面のアクティビティでそれを読むこともできます(そこから再びログイン画面を起動するかもしれません)。
よくわかりませんが、このフラグでログインしてみることもできます。その場合、アクティビティがどのように注文されるかわかりません。だから、あなたが現在いるものを含める画面の下のものをクリアするかどうかはわかりませんが、それは間違いなく行くべき道です。
お役に立てれば。
他のヒント
あなたは試すかもしれません Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK
. 。以前のすべてのアクティビティを完全にクリアし、新しいアクティビティを開始します。
新しいアクティビティを起動する前に、次のコードを追加するだけです。
finishAffinity();
または、Androidの以前のバージョンで動作したい場合:
ActivityCompat.finishAffinity(this);
ユーザーがすべてのオープンアクティビティを終了したい場合, 、アプリケーションが起動したときに実行される最初のアクティビティをロードするボタンを押し、他のすべてのアクティビティをクリアしてから、最後の残りのアクティビティを終了する必要があります。ユーザーが終了ボタンを押すと、次のコードを実行します。私の場合、 LoginActivity
私のプログラムで実行される最初のアクティビティです。
Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("EXIT", true);
startActivity(intent);
上記のコードは、以外のすべてのアクティビティをクリアします LoginActivity
. 。次に、次のコードを内部に配置します LoginActivity
's onCreate(...)
, 、いつを聞く LoginActivity
再作成され、「出口」信号が渡されました。
if (getIntent().getBooleanExtra("EXIT", false)) {
finish();
}
Androidの出口ボタンを硬いのはなぜですか?
Androidは、使用するプログラムがバックグラウンドで実行されているかどうかをユーザーに気にしないようにしたいため、アプリケーションに「終了」ボタンを持っていることを思いとどまらせようとします。
Android OSの開発者は、プログラムが電話の予期しないシャットダウンとパワーを乗り切ることができることを望んでおり、ユーザーがプログラムを再起動すると、彼らは中断したところから拾い上げます。そのため、ユーザーはアプリケーションを使用している間に電話を受けることができ、より多くのリソースのためにアプリケーションを解放する必要があるマップを開くことができます。
ユーザーがアプリケーションを再開すると、中断せずに中断したところからすぐに取り上げられます。この出口ボタンは、アクティビティマネージャーからのパワーを奪い、自動的に管理されたAndroidプログラムのライフサイクルに問題を引き起こす可能性があります。
Intent intent = new Intent(this, classObject);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
これは、すべてのAndroidバージョンで機能します。どこ IntentCompat
クラスはAndroidサポートライブラリに追加されました。
アクティビティには以下を使用してください
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
Fragmentを使用するには、Clear_taskフラグを削除します。
これが一部の人々に使用されることを願っています。
public void finishAffinity ()
APIレベル16に追加されました
このアクティビティと、同じ親和性を持つ現在のタスクでそのすぐ下のすべてのアクティビティを完了します。これは通常、アプリケーションを別のタスク(理解しているコンテンツタイプのAction_Viewから)に起動できる場合に使用され、ユーザーはUPナビゲーションを使用して現在のタスクから切り替えて、独自のタスクに切り替えました。この場合、ユーザーが2番目のアプリケーションの他のアクティビティに移動した場合、タスクスイッチの一部としてそれらのすべてを元のタスクから削除する必要があります。
この仕上げでは、以前のアクティビティに結果を提供することはできず、そうしようとしている場合は例外がスローされることに注意してください。
私は遅れていると思いますが、簡単で短い答えがあります。現在のアクティビティとすべての親アクティビティを完了するアクティビティには、finishfidinit()メソッドがありますが、Android 4.1以降でのみ機能します。
API 16+の場合、使用します
finishAffinity();
16未満の場合、使用します
ActivityCompat.finishAffinity(YourActivity.this);
それが役に立てば幸い!
サイドノートでは、知っておくとよいでしょう
この答えは機能します(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);
アプリケーションに最小の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
私がこれのために実装したソリューション(私はどこかでスタックオーバーフローでそれを見つけたと思いますが、覚えていないので、そもそもそれをした人に感謝します):
あなたの活動のいずれかからこれを行います:
// Clear your session, remove preferences, etc.
Intent intent = new Intent(getBaseContext(), LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
次に、ログニタビティで、OnKeyDownを上書きします。
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
moveTaskToBack(true);
return true;
}
return super.onKeyDown(keyCode, event);
}
アプリの最後の画面のログアウトボタンの場合、ログアウトボタンリスナーでこのコードを使用して、以前のすべてのアクティビティをすべて完了すると、問題が解決します。
{
Intent intent = new Intent(this, loginScreen.class);
ntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
}
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();
私はあなたが使用できる同じ問題を抱えています IntentCompat
、 このような :
import android.support.v4.content.IntentCompat;
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);
このコードは私のために機能します。
Android API 17
使用する代わりに finish()
使用するだけです finishAffinity();
私の場合、私は使用します finishAffinity()
次のような最後のアクティビティの関数:
finishAffinity()
startHomeActivity()
それが役に立つことを願っています。
ログイン - >ホーム - >画面1->画面2->画面3->画面4->画面5
画面4(またはその他) - >
StartActivity(Log in)と
FLAG_ACTIVITY_CLEAR_TOP
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);
使用している場合 startActivityForResult()
以前の活動では、オーバーライドしてください OnActivityResult()
そして、電話してください finish();
すべてのアクティビティでその内部の方法..これは仕事をします...
ユーザーがログアウトボタンをクリックしたら、次のコードを書き込みます。
Intent intent = new Intent(this, LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
また、新しいアクティビティを呼び出す場合にもログイン後の場合は、finish()を使用しません。
単純に、ログイン画面を完成させるときではなく、ログイン画面から移動するとき。
そして、すべてのフォワードアクティビティで、これをログアウトに使用します。
final Intent intent = new Intent(getBaseContext(), LoginScreen.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
context.startActivity(intent);
それは完全に機能します。
ユーザーにログインした場合 screen 1
そして、そこから他の画面に行き、使用してください
Intent intent = new Intent(this, Screen1.class);
intent.addFlags(FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
私はこのように見つけました、それはすべての歴史と出口をクリアするでしょう
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);
APIレベルにもかかわらず、すべてのデバイスで動作するこのソリューションが見つかりました(11未満)
Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
ComponentName cn = intent.getComponent();
Intent mainIntent = IntentCompat.makeRestartActivityTask(cn);
startActivity(mainIntent);