複数のページ、つまり複数のアクティビティがあるアプリケーションがあり、それらの一部は開いたままです。
すべてのアクティビティを一度に閉じる方法はありますか?
開いているすべてのアクティビティを終了する場合は常に、アプリケーションの起動時に実行される最初のアクティビティを読み込むボタンを押してから、他のすべてのアクティビティをクリアし、最後の残りのアクティビティを終了する必要があります。そのためには、以下のコードをurプロジェクトに適用します
Intent intent = new Intent(getApplicationContext(), FirstActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("EXIT", true);
startActivity(intent);
上記のコードは、FirstActivityを除くすべてのアクティビティを終了します。次に、FirstActivityのoncreateでFirstActivityのEnter the below codeを完了する必要があります。
if (getIntent().getBooleanExtra("EXIT", false)) {
finish();
}
これで完了です。
Activity
には finishAffinity()
メソッドがあり、現在のアクティビティとすべての親アクティビティを終了しますが、Android 4.1以降でのみ機能します。
API 16+の場合、使用
finishAffinity();
低い(Android 4.1低い)には、
ActivityCompat.finishAffinity(YourActivity.this);
私が見つけた最良のソリューションは、APIレベル<11のデバイスと互換性があります
Intent intent = new Intent(getApplicationContext(), HomeActivity.class);
ComponentName cn = intent.getComponent();
Intent mainIntent = IntentCompat.makeRestartActivityTask(cn);
startActivity(mainIntent);
このソリューションにはAndroidサポートライブラリが必要です
API 16+の場合、使用
finishAffinity();
低くするには
ActivityCompat.finishAffinity(YourActivity.this)
アクティビティ履歴をクリアするための3つのソリューションがあります。
1)インテントを介して新しいアクティビティを開始するときにfinish()
を書くことができます。
2)Androidmanifest.xmlファイルのすべてのAndroid:noHistory="true"
タグに<activity>
を書き込みます。これは、新しいアクティビティを開いており、その時点でfinish()を書き込まない場合に使用します。アクティビティは次のようになります。
<activity
Android:name=".Splash_Screen_Activity"
Android:label="@string/app_name"
Android:noHistory="true">
</activity>
3)アプリケーションを終了するには、system.exit(0)
を記述します。
私は同じ問題に苦しんでいました。アバウトページを開いてそこからfinish();
を呼び出すのではなく、アプリを閉じるのではなく、前のアクティビティに進み、アバウトページ自体からアプリを閉じたいと思いました。
これは私のために働いたコードです:
Intent startMain = new Intent(Intent.ACTION_MAIN);
startMain.addCategory(Intent.CATEGORY_HOME);
startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(startMain);
finish();
お役に立てれば。
より「本」に近く、方法論的に設計されている(BroadcastReceiverを使用)ように見えるソリューションを探している場合は、次のリンクをご覧ください。 http://www.hrupin.com/2011/10/how-to-finish-all-activities-in-your-Android-application-through-simple-call 。
そのリンクに表示される提案された実装では、わずかな変更が必要です-sendBroadcast(Intent)ではなくsendStickyBroadcast(Intent)メソッドを使用して(マニフェストにBROADCAST_STICKYパーミッションを追加することを忘れないでください)、ブロードキャストを受信して処理できるようにアクティビティを一時停止しました。これは、開始アクティビティのonCreate()メソッドでremoveStickyBroadcast(Intent)メソッドを呼び出すことにより、アプリケーションの再起動中にそのスティッキーブロードキャストも削除する必要があることを意味します。
上記のstartActivity(...)ベースのソリューションは、一見したところ-非常に素晴らしく、エレガントで、短く、実装が簡単であるように見えます-少し「間違っている」と感じます(アクティビティを開始するために-可能な限り単にそれを殺すために必要とされ、それに関与するかもしれないオーバーヘッドとリソース?...)
現在のアクティビティとすべての親アクティビティを終了するfinishAffinity()
メソッドを使用できます。ただし、API 16+
に対してのみ機能します。
API 16+使用:
finishAffinity();
API 16使用以下:
ActivityCompat.finishAffinity(this); //with v4 support library
アプリ全体を終了するには:
finishAffinity(); // Close all activites
System.exit(0); // closing files, releasing resources
次の2つのフラグが機能しました。 すべてクリア以前のアクティビティと新しいアクティビティを開始
Intent intent = new Intent(getApplicationContext(), MyDetails.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
お役に立てれば。
あなたはちょうどfinishAffinity()を試すことができ、そのすべての現在のアクティビティを閉じて上記のv4.1で動作します
上記の答えはどれも私にとってはうまくいきませんでした。しかし、私はさらに調査し、最終的に答えを得ました。
実際に、必要に応じてアプリを閉じるように要求しました。そのため、次のコードを追加します
finishAffinity();
これが皆さんのお役に立てば幸いです。
つかいます
finishAffinity ();
の代わりに:
System.exit(); or finish();
アプリケーション全体またはすべてのアクティビティを終了します。
ブールフラグを保存して、すべてのアクティビティを終了するかどうか(共有設定で優先される)を表す場合、各アクティビティのonStart()
メソッドには次のようなものが必要です。
SharedPreferences pref=PreferenceManager.getDefaultSharedPreferences(this);
boolean needToDestroyFlag=pref.getBoolean("destroyFlag", false);
if(needToDestroyFlag)
{
finish();
}else
{
//...
}
明らかに、現在のアクティビティでfinish()メソッドを呼び出して、現在のアクティビティを終了し、アクティビティをスタックからポップすることができます。 1つは、それぞれのonStart()メソッドが実行され、終了させます。
SharedPreferences.Editor editor=PreferenceManager.getDefaultSharedPreferences(this).edit();
editor.putBoolean("destroyFlag", true);
editor.apply();
@letsnurtureが提案した方法を使用すると、@ gumuruhからの質問に直面することになります。
finishAffinity()
の問題は、現在のタスクのアクティビティのみが閉じられますが、singleInstance
launchModeおよびその他のタスクのアクティビティはまだ開かれ、finishAffinity()
の後に前面に表示されることです。 System.exit(0)
の問題は、すべてのバックグラウンドサービスとすべての割り当てられたメモリでAppプロセスを終了することです。これにより、望ましくない副作用が発生する可能性があります(たとえば、通知を受信しなくなる)。
以下は、両方の問題を解決する他の2つの選択肢です:
ActivityLifecycleCallbacks
を使用して、作成したアクティビティを登録し、必要に応じて閉じます。 https://Gist.github.com/sebaslogen/5006ec133243379d293f9d6221100ddb#file-myandroidapplication-kt-L1ActivityLifecycleMonitorRegistry
を使用できます。 https://github.com/sebaslogen/CleanGUITestArchitecture/blob/master/app/src/androidTest/Java/com/neoranga55/cleanguitestarchitecture/util/ActivityFinisher.Java #L15根ざしている場合:
Runtime.getRuntime().exec("su -c service call activity 42 s16 com.example.your_app");
次のコードを使用できます。
Intent i = new Intent(OldActivity.this, NewActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(i);
アプリを閉じます
Intent intent = new Intent(getApplicationContext(), Splash_Screen.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("EXIT", true);
startActivity(intent);
これを、開かれた最初のアクティビティのoncreateおよびonResumeに入れます。例スプラッシュスクリーンアクティビティ
if (getIntent().getBooleanExtra("EXIT", false)) {
this.finish();
System.exit(0);
}