71

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

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

4

21 に答える 21

135

開いているすべてのアクティビティを終了する場合は、アプリケーションの開始時に実行される最初のアクティビティをロードするボタンを押してから、他のすべてのアクティビティをクリアしてから、残りの最後のアクティビティを終了する必要があります。これを行うには、次のコードを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();
}

そして、あなたは完了です...。

于 2012-12-22T10:28:11.030 に答える
78

finishAffinity()現在のアクティビティとすべての親アクティビティを終了する方法がありますがActivity、Android4.1以降でのみ機能します。

API 16以降の場合は、

finishAffinity();

低い(Android 4.1より低い)場合は、

ActivityCompat.finishAffinity(YourActivity.this);
于 2015-08-25T11:39:15.587 に答える
24

私が見つけた最良の解決策は、APIレベルが11未満のデバイスと互換性があります

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

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

于 2014-04-24T09:59:15.240 に答える
22

API 16以降の場合は、

finishAffinity();

低い場合は、

ActivityCompat.finishAffinity(YourActivity.this)
于 2017-01-20T00:10:21.517 に答える
12

明確な活動履歴のための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)アプリケーションを終了するために書き込みます。

于 2012-12-22T10:46:06.513 に答える
11

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
于 2018-06-02T21:28:04.993 に答える
9

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

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

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

お役に立てれば。

于 2014-07-21T18:07:55.590 に答える
9

次の2つのフラグが私のために働いた。彼らは以前のすべての活動をクリアし、新しい活動を開始します

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

お役に立てれば。

于 2016-05-29T07:58:28.247 に答える
8

他の答えはどれも私にはうまくいきませんでした。しかし、私はもう少し調べて、最終的に答えを得ました。

あなたは実際に私が必要に応じてアプリを閉じるように頼みました。したがって、次のコードを追加します。

finishAffinity();

于 2018-07-17T20:24:03.577 に答える
4

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

于 2014-06-15T18:28:30.610 に答える
3

あなたはただfinishAffinity()を試すことができます、それはv4.1より上で働くために現在のすべての活動を閉じます

于 2015-04-01T09:34:22.153 に答える
3

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

両方の問題を解決する他の2つの選択肢があります:

  1. アプリクラスで使用ActivityLifecycleCallbacksして、作成されたアクティビティを登録し、必要に応じて閉じます:https ://gist.github.com/sebaslogen/5006ec133243379d293f9d6221100ddb#file-myandroidapplication-kt-L10
  2. テストでは、次を使用できますActivityLifecycleMonitorRegistryhttps ://github.com/sebaslogen/CleanGUITestArchitecture/blob/master/app/src/androidTest/java/com/neoranga55/cleanguitestarchitecture/util/ActivityFinisher.java#L15
于 2018-01-28T17:16:28.887 に答える
1

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

于 2014-07-18T20:51:08.113 に答える
1

使用する

finishAffinity ();

それ以外の:

System.exit(); or finish();

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

于 2018-02-24T20:21:08.003 に答える
1

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

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

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

startActivity(i);
于 2019-07-17T14:22:37.053 に答える
0

根付いている場合:

Runtime.getRuntime().exec("su -c service call activity 42 s16 com.example.your_app");
于 2015-05-15T13:58:24.803 に答える
0

アプリを閉じる

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);
        }
于 2018-08-17T08:30:53.217 に答える
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();
    }
于 2019-09-14T05:35:07.350 に答える
0

moveTaskToBack(true);

//これをクリックリストナーに追加します

于 2020-01-23T12:31:35.450 に答える
0
@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();
    }
于 2020-11-11T12:16:03.607 に答える
-9

私は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();
    }
于 2014-11-20T12:42:11.547 に答える