複数のページ、つまり複数のアクティビティを持つアプリケーションがあり、それらのいくつかは開いたままです。
すべてのアクティビティを一度に閉じる方法はありますか?
複数のページ、つまり複数のアクティビティを持つアプリケーションがあり、それらのいくつかは開いたままです。
すべてのアクティビティを一度に閉じる方法はありますか?
開いているすべてのアクティビティを終了する場合は、アプリケーションの開始時に実行される最初のアクティビティをロードするボタンを押してから、他のすべてのアクティビティをクリアしてから、残りの最後のアクティビティを終了する必要があります。これを行うには、次のコードをurプロジェクトに適用します
Intent intent = new Intent(getApplicationContext(), FirstActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("EXIT", true);
startActivity(intent);
上記のコードは、FirstActivityを除くすべてのアクティビティを終了します。次に、FirstActivityを終了する必要があります。Firstactivityのoncreateに以下のコードを入力します。
if (getIntent().getBooleanExtra("EXIT", false)) {
finish();
}
そして、あなたは完了です...。
finishAffinity()
現在のアクティビティとすべての親アクティビティを終了する方法がありますがActivity
、Android4.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)
アプリケーションを終了するために書き込みます。
finishAffinity()
現在のアクティビティとすべての親アクティビティを終了するメソッドを使用できます。ただし、は。に対してのみ機能しAPI 16+
ます。
API 16以降の使用:
finishAffinity();
以下のAPI16の使用:
ActivityCompat.finishAffinity(this); //with v4 support library
アプリ全体を終了するには:
finishAffinity(); // Close all activites
System.exit(0); // closing files, releasing resources
私は同じ問題に苦しんでいました。アバウトページを開いてfinish();
そこから呼び出すと、アプリを閉じるのではなく、前のアクティビティに移動し、アバウトページ自体からアプリを閉じたいと思いました。
これは私のために働いたコードです:
Intent startMain = new Intent(Intent.ACTION_MAIN);
startMain.addCategory(Intent.CATEGORY_HOME);
startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(startMain);
finish();
お役に立てれば。
次の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();
より「本によって」、方法論的に設計された(BroadcastReceiverを使用した)ソリューションを探している場合は、次のリンクを参照してください:http ://www.hrupin.com/2011/10 /how-to-finish-all-activities-in-your-android-application-through-simple-call。
そのリンクに表示される提案された実装には、わずかな変更が必要です。sendBroadcast(Intent)を有効にするには、sendBroadcast(Intent)ではなくsendStickyBroadcast(Intent)メソッドを使用する必要があります(マニフェストにBROADCAST_STICKY権限を追加することを忘れないでください)。ブロードキャストを受信して処理できるようにアクティビティを一時停止しました。これは、アプリケーションを再起動するときに、開始アクティビティのonCreate()メソッドでremoveStickyBroadcast(Intent)メソッドを呼び出して、スティッキーブロードキャストも削除する必要があることを意味します。
上記のstartActivity(...)ベースのソリューションですが、一見すると、非常に素晴らしく、エレガントで、短く、高速で、実装が簡単なように見えますが、(アクティビティを開始するには)少し「間違っている」と感じます。それを殺すためだけに、必要とされ、それに関与する可能性のあるオーバーヘッドとリソース?...)
あなたはただfinishAffinity()を試すことができます、それはv4.1より上で働くために現在のすべての活動を閉じます
問題finishAffinity()
は、現在のタスクのアクティビティのみが閉じられているが、singleInstance
launchModeや他のタスクのアクティビティは開いたままで、その後フォアグラウンドに移動することfinishAffinity()
です。の問題System.exit(0)
は、すべてのバックグラウンドサービスとすべての割り当てられたメモリを使用してアプリプロセスを終了することです。これにより、望ましくない副作用が発生する可能性があります(たとえば、通知を受信できなくなるなど)。
両方の問題を解決する他の2つの選択肢があります:
ActivityLifecycleCallbacks
して、作成されたアクティビティを登録し、必要に応じて閉じます:https ://gist.github.com/sebaslogen/5006ec133243379d293f9d6221100ddb#file-myandroidapplication-kt-L10ActivityLifecycleMonitorRegistry
:https ://github.com/sebaslogen/CleanGUITestArchitecture/blob/master/app/src/androidTest/java/com/neoranga55/cleanguitestarchitecture/util/ActivityFinisher.java#L15すべてのアクティビティを終了する必要があるかどうかを表すブールフラグを保存できます(共有設定でより優先されます)。onStart()
各アクティビティのメソッドは次のようになります。
SharedPreferences pref=PreferenceManager.getDefaultSharedPreferences(this);
boolean needToDestroyFlag=pref.getBoolean("destroyFlag", false);
if(needToDestroyFlag)
{
finish();
}else
{
//...
}
明らかに、(現在のアクティビティ内の)すべてのアクティビティを終了する必要がある場合は、次のようにこのフラグを設定できます。これにより、現在のアクティビティでfinish()メソッドを呼び出して、現在のアクティビティを終了し、スタックからアクティビティを1つずつポップできます。 1つは、それぞれのonStart()メソッドが実行され、それを終了させます。
SharedPreferences.Editor editor=PreferenceManager.getDefaultSharedPreferences(this).edit();
editor.putBoolean("destroyFlag", true);
editor.apply();
@letsnurtureが提案した方法を使用すると、@gumuruhからの質問に直面することになります。
使用する
finishAffinity ();
それ以外の:
System.exit(); or finish();
アプリケーション全体またはすべてのアクティビティを終了します。
次のコードを使用できます。
Intent i = new Intent(OldActivity.this, NewActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(i);
根付いている場合:
Runtime.getRuntime().exec("su -c service call activity 42 s16 com.example.your_app");
アプリを閉じる
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);
}
in LoginActivity
@Override
public void onBackPressed() {
Intent startMain = new Intent(Intent.ACTION_MAIN);
startMain.addCategory(Intent.CATEGORY_HOME);
startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(startMain);
finish();
super.onBackPressed();
}
moveTaskToBack(true);
//これをクリックリストナーに追加します
@Override
public void onBackPressed(){
MaterialAlertDialogBuilder alert = new MaterialAlertDialogBuilder(BorrowForm.this, MyTheme);
alert.setTitle("Confirmation");
alert.setCancelable(false);
alert.setMessage("App will exit. Data will not be saved. Continue?");
alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast toast = Toast.makeText(BorrowForm.this, "App terminated.", Toast.LENGTH_SHORT);
toast.getView().setBackgroundColor(Color.parseColor("#273036"));
toast.setGravity(Gravity.CENTER_HORIZONTAL,0,0);
TextView toastMessage=(TextView) toast.getView().findViewById(android.R.id.message);
toastMessage.setTextColor(Color.WHITE);
toast.show();
finishAffinity();
}
});
alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
alert.setCancelable(false);
alert.show();
}
私はjava/androidの初心者です、この簡単な解決策があなたのために役立つかもしれません
まず、静的クラスを作成します
public class ActivityManager {
static Activity _step1;
static Activity _step2;
static Activity _step3;
public static void setActivity1(Activity activity)
{
_step1 = activity;
}
public static void setActivity2(Activity activity)
{
_step2 = activity;
}
public static void setActivity3(Activity activity)
{
_step3 = activity;
}
public static void finishAll()
{
_step1.finish();
_step2.finish();
_step3.finish();
}
}
次に 、新しいアクティビティを実行すると、マネージャーへのリンクが保存されます(ステップ1)。
ActivityManager.setActivity1(this);
AddValuesToSharedPreferences();
Intent intent = new Intent(Step1.this, Step2.class);
startActivity(intent);
そして、最後のステップですべてを終了します。
public void OkExit(View v) throws IOException {
ActivityManager.finishAll();
}