私のアプリケーションには以下のフロースクリーンがあります。
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
を使うことができません
問題を解決する方法はありますか?
つかいます:
Intent intent = new Intent(getApplicationContext(), Home.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
これは家の上にすべての活動をクリアします。
ユーザーがログインしてhomeが作成され、その後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
が再作成され 'EXIT'シグナルが渡された時を待つためにLoginActivity
のonCreate(...)
の中に次のコードを入れてください:
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);
フラグメント用にCLEAR_TASKフラグを削除しました。
私はこれが何人かの人々に役立つかもしれないと思います。
public void finishAffinity ()
APIレベル16で追加
現在のタスクで、同じアクティビティを持つ、このアクティビティとそのすぐ下にあるすべてのアクティビティを終了します。これは通常、アプリケーションが別のタスク(アプリケーションが理解しているコンテンツタイプのACTION_VIEWなど)で起動でき、ユーザーが現在のタスクから自分のタスクに切り替えるためにアップナビゲーションを使用した場合に使用されます。この場合、ユーザーが2番目のアプリケーションの他のアクティビティに移動した場合は、タスク切り替えの一環として、それらすべてが元のタスクから削除されます。
この終了で前のアクティビティに結果を配信することはできません。そのようにしようとしている場合は例外がスローされます。
私は遅れていると思いますが、簡単で短い答えがあります。現在のアクティビティとすべての親アクティビティを終了するActivityにfinishAffinity()メソッドがありますが、Android 4.1以降でのみ機能します。
API 16以降の場合は、
finishAffinity();
16未満の場合は、
ActivityCompat.finishAffinity(YourActivity.this);
それが役に立てば幸い!
あなたのアプリケーションが最小の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
ちょっとしたメモ、知っておくと良い
この答えはうまくいきます( 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);
アプリの最後の画面のログアウトボタンの場合は、ログアウトボタンのリスナーでこのコードを使用して、開いている過去のアクティビティをすべて終了すると、問題は解決します。
{
Intent intent = new Intent(this, loginScreen.class);
ntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
}
私がこれのために実装した解決策(私は私がどこかに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);
}
私はあなたがこのようにIntentCompat
を使用することができる同じ問題を抱えている:
import Android.support.v4.content.IntentCompat;
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);
このコードは私のために働きます。
Android API 17
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();
finish()
を使う代わりにfinishAffinity();
を使うだけです
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);
ログイン - >ホーム - >画面1 - >画面2 - >画面3 - >画面4 - >画面5
画面4(またはその他の)で - >
StartActivity(ログイン)
FLAG_ACTIVITY_CLEAR_TOP
以前のアクティビティでstartActivityForResult()
を使用している場合は、すべてのアクティビティでOnActivityResult()
をオーバーライドしてその中のfinish();
メソッドを呼び出すだけです。
私の場合は、最後のアクティビティでfinishAffinity()
関数を使います。
finishAffinity()
startHomeActivity()
それが役に立つことを願っています。
ユーザーがログアウトボタンをクリックしたら、次のコードを書きます。
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);
それは完璧に機能します。
私はこのようにして見つけました、それはすべての歴史をクリアして終了します
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);
ユーザーをscreen 1
でログインし、そこから他の画面に移動した場合は、次のコマンドを使用します。
Intent intent = new Intent(this, Screen1.class);
intent.addFlags(FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
私はこの解決策がAPIレベルにもかかわらずすべてのデバイスで機能することを確認しました(11未満でさえ)。
Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
ComponentName cn = intent.getComponent();
Intent mainIntent = IntentCompat.makeRestartActivityTask(cn);
startActivity(mainIntent);