web-dev-qa-db-ja.com

すべてのアクティビティを一度に完了します

複数のページ、つまり複数のアクティビティがあるアプリケーションがあり、それらの一部は開いたままです。

すべてのアクティビティを一度に閉じる方法はありますか?

55
steve

開いているすべてのアクティビティを終了する場合は常に、アプリケーションの起動時に実行される最初のアクティビティを読み込むボタンを押してから、他のすべてのアクティビティをクリアし、最後の残りのアクティビティを終了する必要があります。そのためには、以下のコードを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();
}

これで完了です。

120
letsnurture

Activityには finishAffinity() メソッドがあり、現在のアクティビティとすべての親アクティビティを終了しますが、Android 4.1以降でのみ機能します。

API 16+の場合、使用

finishAffinity();

低い(Android 4.1低い)には、

ActivityCompat.finishAffinity(YourActivity.this);
60
King of Masses

私が見つけた最良のソリューションは、APIレベル<11のデバイスと互換性があります

Intent intent = new Intent(getApplicationContext(), HomeActivity.class);
ComponentName cn = intent.getComponent();
Intent mainIntent = IntentCompat.makeRestartActivityTask(cn);
startActivity(mainIntent);

このソリューションにはAndroidサポートライブラリが必要です

23
Mongi Zaidi

API 16+の場合、使用

finishAffinity();

低くするには

ActivityCompat.finishAffinity(YourActivity.this)
18
Radu Grigoras

アクティビティ履歴をクリアするための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)を記述します。

11
Dipak Keshariya

私は同じ問題に苦しんでいました。アバウトページを開いてそこからfinish();を呼び出すのではなく、アプリを閉じるのではなく、前のアクティビティに進み、アバウトページ自体からアプリを閉じたいと思いました。

これは私のために働いたコードです:

Intent startMain = new Intent(Intent.ACTION_MAIN); 
startMain.addCategory(Intent.CATEGORY_HOME); 
startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(startMain); 
finish();

お役に立てれば。

9
TheOddAbhi

より「本」に近く​​、方法論的に設計されている(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(...)ベースのソリューションは、一見したところ-非常に素晴らしく、エレガントで、短く、実装が簡単であるように見えます-少し「間違っている」と感じます(アクティビティを開始するために-可能な限り単にそれを殺すために必要とされ、それに関与するかもしれないオーバーヘッドとリソース?...)

4
user3139591

現在のアクティビティとすべての親アクティビティを終了する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
4
Hasib Akter

次の2つのフラグが機能しました。 すべてクリア以前のアクティビティと新しいアクティビティを開始

  Intent intent = new Intent(getApplicationContext(), MyDetails.class);
  intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
  intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  startActivity(intent);

お役に立てれば。

4
Ajji

あなたはちょうどfinishAffinity()を試すことができ、そのすべての現在のアクティビティを閉じて上記のv4.1で動作します

2
Vinodh Kumar

上記の答えはどれも私にとってはうまくいきませんでした。しかし、私はさらに調査し、最終的に答えを得ました。

実際に、必要に応じてアプリを閉じるように要求しました。そのため、次のコードを追加します

finishAffinity();

これが皆さんのお役に立てば幸いです。

2
Himanshu Sharma

つかいます

finishAffinity ();

の代わりに:

System.exit(); or finish();

アプリケーション全体またはすべてのアクティビティを終了します。

1
Anandhu Vijayan

ブールフラグを保存して、すべてのアクティビティを終了するかどうか(共有設定で優先される)を表す場合、各アクティビティの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からの質問に直面することになります。

1
Dmila Ram

finishAffinity()の問題は、現在のタスクのアクティビティのみが閉じられますが、singleInstance launchModeおよびその他のタスクのアクティビティはまだ開かれ、finishAffinity()の後に前面に表示されることです。 System.exit(0)の問題は、すべてのバックグラウンドサービスとすべての割り当てられたメモリでAppプロセスを終了することです。これにより、望ましくない副作用が発生する可能性があります(たとえば、通知を受信しなくなる)。

以下は、両方の問題を解決する他の2つの選択肢です

  1. アプリクラスでActivityLifecycleCallbacksを使用して、作成したアクティビティを登録し、必要に応じて閉じます。 https://Gist.github.com/sebaslogen/5006ec133243379d293f9d6221100ddb#file-myandroidapplication-kt-L1
  2. テストでは、ActivityLifecycleMonitorRegistryを使用できます。 https://github.com/sebaslogen/CleanGUITestArchitecture/blob/master/app/src/androidTest/Java/com/neoranga55/cleanguitestarchitecture/util/ActivityFinisher.Java #L15
1
Sebas LG

根ざしている場合:

Runtime.getRuntime().exec("su -c service call activity 42 s16 com.example.your_app");
0
nafsaka

次のコードを使用できます。

Intent i = new Intent(OldActivity.this, NewActivity.class);

i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);

startActivity(i);
0
Enad

アプリを閉じます

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);
        }