プログラムでAndroidアプリを終了する方法は?


93

私はいくつか読んだので、この質問は何度も聞かれたと確信しています。クライアントは、ユーザーがクリックして終了できるボタンをアプリに配置することを望んでいます。私はこれを読みましたそして、呼び出しfinish()がそれをするであろうとわかりました。しかし、フィニッシュは現在実行中のアクティビティを閉じるだけですよね?私はたくさんのアクティビティを持っているので、この場合、すべてのアクティビティのインスタンスを渡してそれらを終了するか、すべてのアクティビティをシングルトンパターンにする必要があります。

またActivity.moveTaskToBack(true)、ホーム画面に移動できることも知りました。OK、これは終了ではなく、プロセスのバックグラウンドです。それで、これは効果的ですか?

アプリを完全に閉じるには、どの方法を使用する必要がありますか?上記のいずれかまたは他の方法/上記の方法の他の使用法?


アクションバーを使ってみませんか。アプリアイコンをクリックして、ホーム画面に移動します。戻るボタンをクリックして終了します
Raghunandan 2013

@Raghunandan:私が言ったように、クライアントの要件:(
レモンジュース

これがandroid.os.Process.killProcess(android.os.Process.myPid());に役立つかどうかを確認します。
SANorton Stanley 2013


回答:


71

実際、アクティビティがどこにあっても、誰もがonclickイベントでアプリケーションを閉じることを探しています。

だからみんな友達がこのコードを試してみます。このコードをonclickイベントに配置します

Intent homeIntent = new Intent(Intent.ACTION_MAIN);
    homeIntent.addCategory( Intent.CATEGORY_HOME );
    homeIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);  
    startActivity(homeIntent); 

8
これは、アプリがまだ実行されているため、PeakGenが尋ねたように実際には「アプリを完全に閉じる」わけではありませんが、優れた代替手段です
La masse

2
FLAG活動NEW TASKを開始する活動が、この方法は、それを終了することができない場合、私は、そうは思わない
fozua

51

System.exit();を呼び出すことができます。すべての活動から抜け出すために。

    submit=(Button)findViewById(R.id.submit);

            submit.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View arg0) {
android.os.Process.killProcess(android.os.Process.myPid());
                    System.exit(1);

                }
            });

5
それはちょうど私を最初の活動に連れて行っています
レモンジュース

8
@AnchitMittal System.exit(1)は、アクティビティスタックまたはタスクのリセットを保証しません(developer.android.com/guide/components/…を参照)。したがって、このアプローチは、アプリの適切なシャットダウン(すべてのアクティビティの破棄)が期限内に行われることを保証するものではありません。
IgorGanapolsky 2014年

すべてのアクティビティが終了するわけではありません。
Jitendra 2017年

49

API 16でリリースされたfinishAffinityメソッドは、進行中のすべてのアクティビティを閉じ、アプリを閉じます。

this.finishAffinity();

このアクティビティと、現在のタスクで同じアフィニティを持つそのすぐ下のすべてのアクティビティを終了します。これは通常、アプリケーションを別のタスクで起動でき(理解できるコンテンツタイプのACTION_VIEWからなど)、ユーザーがアップナビゲーションを使用して現在のタスクから独自のタスクに切り替える場合に使用されます。この場合、ユーザーが2番目のアプリケーションの他のアクティビティに移動した場合は、タスク切り替えの一部としてそれらすべてを元のタスクから削除する必要があります。

この終了では、前のアクティビティに結果を提供することはできず、そうしようとすると例外がスローされることに注意してください。


API 21以降、次を使用できます。

finishAndRemoveTask();

このタスクのすべてのアクティビティを終了し、最近のタスクリストから削除します。

代替案:

getActivity().finish();
System.exit(0);


int pid = android.os.Process.myPid();
android.os.Process.killProcess(pid);


Process.sendSignal(Process.myPid(), Process.SIGNAL_KILL);


Intent i = new Intent(context, LoginActivity.class);
i.putExtra(EXTRA_EXIT, true);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
context.startActivity(i);

出典:Androidアプリケーションをプログラムで終了する方法


それが役に立てば幸い!幸運を!


2
System.exit()は使用しないでください。Androidは、アプリが終了した後、アプリの再起動を試みます。ループに陥る可能性があります。
AndroidDev

42

アプリケーションを終了する場合は、ボタンが押されたイベント内で次のコードを使用します。

public void onBackPressed() {
  moveTaskToBack(true);
  android.os.Process.killProcess(android.os.Process.myPid());
  System.exit(1);
}

24
 @Override
    public void onBackPressed() {
        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
        alertDialogBuilder.setTitle("Exit Application?");
        alertDialogBuilder
                .setMessage("Click yes to exit!")
                .setCancelable(false)
                .setPositiveButton("Yes",
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                                moveTaskToBack(true);
                                android.os.Process.killProcess(android.os.Process.myPid());
                                System.exit(1);
                            }
                        })

                .setNegativeButton("No", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {

                        dialog.cancel();
                    }
                });

        AlertDialog alertDialog = alertDialogBuilder.create();
        alertDialog.show();
    }

4
System.exit(1);の違い およびSystem.exit(0);
Pyae Phyo 2016

System.exit(1)は、アプリがエラーで終了したことを意味し、System.exit(0)は、アプリがエラーなしで終了したことを意味します。これは、さまざまなlinux / unixコマンドが終了時に(エラー)状態を返す方法です。
iOS-Coder


13

正確には、2つの可能な状況があります。

  1. アクティビティを終了することをお勧めします
  2. または、アプリケーションを終了します

次のコードを使用して、アクティビティを終了できます。

var intent = new Intent(Intent.ActionMain);
intent.AddCategory(Intent.CategoryHome);
intent.SetFlags(ActivityFlags.NewTask);
startActivity(intent);
finish();

ただし、これによって同じアプリケーションの基になるアクティビティが強制終了されることはありません。これにより、アプリケーションが最小限に抑えられます。

アプリケーションを終了する場合は、次のコードを使用してプロセスを終了します。

android.os.Process.killProcess(android.os.Process.myPid()); 

モノ開発の場合は、

process.KillProcess(Process.MyPid());

Mypidは().....あなたの方法やどのような......そうuが書き込みMypidを持っているか... uはメソッドに記述する必要があります
Amitsharma

@amitsharma MyPid()は、Processクラスのメソッドであり、このプロセスの識別子を返します。これは、killProcess(int)およびsendSignal(int、int)で使用できます。
Kasun

バックグラウンドサービスとブロードキャストレシーバーも停止しますか、それともアプリを安全に閉じますか?
ウスマンラナ2016

そう、違いは何だandroid.os.Process.killProcess(android.os.Process.myPid()); とはprocess.KillProcess(Process.MyPid());
DysaniazzZ

7

どうですか this.finishAffinity()

ドキュメントから、

このアクティビティと、現在のタスクで同じアフィニティを持つそのすぐ下のすべてのアクティビティを終了します。これは通常、アプリケーションを別のタスクで起動でき(理解できるコンテンツタイプのACTION_VIEWからなど)、ユーザーがアップナビゲーションを使用して現在のタスクから独自のタスクに切り替える場合に使用されます。この場合、ユーザーが2番目のアプリケーションの他のアクティビティに移動した場合は、タスク切り替えの一部としてそれらすべてを元のタスクから削除する必要があります。この終了では、前のアクティビティに結果を提供することはできず、そうしようとすると例外がスローされることに注意してください。


6
android.os.Process.killProcess(android.os.Process.myPid());

私の場合、これは私の命を救いました。ありがとうございました!
リフカ

4

これにより、タスク(アクティビティのスタック)がクリアされ、新しいタスクが開始されます

Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
System.exit(1);

このコードを回答として投稿した理由と、それが何をするのかを説明してください。
M. Adeel Khalid 2017

1
Stack Overflowへようこそ!このユーザーの問題は解決したかもしれませんが、コードのみの回答は、将来この質問に来るユーザーにはあまり役立ちません。コードが元の問題を解決する理由を説明するために、回答を編集してください。
ジョーC

3
 @Override
    public void onBackPressed() {
        Intent homeIntent = new Intent(Intent.ACTION_MAIN);
        homeIntent.addCategory( Intent.CATEGORY_HOME );
        homeIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(homeIntent);
    }

2

これをonClicに入れてください:

moveTaskToBack(true);
    finish()

反対票の何が問題なのか。これが答えです。2つのアクティビティがあります。1つ目はloginactivity、2つ目はmainactivityです。mainactivity内でアプリを終了したいのですが、loginactivityに戻りたくありません...この回答を挿入すると、mainactivity内でアプリを閉じることができます。
Azizi Musa

これを行うと、アプリケーションは引き続きバックグラウンドで実行されます
Mohanad Haddadin 2015

正常に動作しています。私の場合:splashActivityはMainActivityを実行します。ユーザーがMainActivityを押し戻すと、アプリケーションは期待どおりに終了します。他のすべてのケースでは、スプラッシュアクティビティに戻ります。
Jviaches

さて、あなたはすぐにログインの完成:)そして、答えはもちろんであるとしてとしてログイン活動を終えなければならない完全に正確ではないmovewTaskToBackそれだけで何も終了していない非表示のアプリを、そしてfinish誰仕上げのみ電流で述べたようにactivity。そのため、現在のアクティビティを終了し、存在する場合は残りを非表示にします。とにかく、これだけで反対票を獲得するべきではありません...
Meow Cat 20

2

通話でこれを試してください。ボタンのonClickで時々使用します。

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

アプリを閉じる代わりにダッシュボードを開くので、アプリが閉じているように見えます。

より明確にするためにこの質問を読んでくださいandroid- アプリケーションコードを終了します


2

this.finishAffinity();を使用します。そのボタンでfinish();の代わりに それが機能しない場合は、マニフェストにandroid:noHistory = "true"を追加して試してから、uisng finish();でアクティビティを終了することもできます。またはfinishAffinity();

それが役に立てば幸い....:)


2

Xamarin.Androidでの達成:

    public override void OnBackPressed()
    {
        MoveTaskToBack(true);
        Process.KillProcess(Process.MyPid());
        Environment.Exit(1);
    }

これはSystem.Environment.ExitまたはAndroid.OS.Environment.Exitへの参照ですか?
モッフェン

2

これらの2つの関数を呼び出すだけです

 finish();
 moveTaskToBack(true);

あなたの答えは質の低い投稿でした。コードは自明ですが、説明をお願いします。
HarshaBiyani19年

2
Intent homeIntent = new Intent(Intent.ACTION_MAIN);
homeIntent.addCategory( Intent.CATEGORY_HOME );
homeIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(homeIntent);
System.exit(1);

このコードを使用すると非常に便利で、すべてのアクティビティを終了できます。


私はこれを行い、5階から電話を投げました。すべての活動は終了しました。ありがとう
Paschalis

1

onCreateでsingletopとfinish()を使用して呼び出されたゴーストアクティビティがトリックを実行する必要があります



1

System.exit(1)の代わりにSystem.exit(0)を使用するだけです


1

誰かがまだのために、不思議場合Xamarin.Android(私の場合もMonogameは、その上で動作する)コマンドFinishAndRemoveTask()には、Activity非常によく仕事をしていません!



0

バックプレスでコードを使用するだけです

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

0

あなたが使用している場合はEventBus活動との間で通信するために、アプリケーションで(あるいは実際に他のパブ/サブライブラリー)を、あなたは彼らに、明示的なイベントを送ることができます。

final public class KillItWithFireEvent
{
    public KillItWithFireEvent() {}

    public static void send()
    {
        EventBus.getDefault().post(new KillItWithFireEvent());
    }
}

これの唯一の欠点は、自分のイベントを呼び出すためにこのイベントを聞くためにすべてのアクティビティが必要なことですfinish()。このために、このイベントをリッスンし、サブクラスに他のすべてを実装させる継承を通じて、シムアクティビティクラスを簡単に作成し、すべてのアクティビティがこの追加レイヤーから継承されることを確認できます。キルリスナーは、特定の状況での死を回避するなど、オーバーライドを介していくつかの追加機能を追加することもできます。


0

アプリケーションを終了するときは、以下の2行を実行するだけです。

android.os.Process.killProcess(android.os.Process.myPid());
System.exit(1);

0
finish();
 finishAffinity();
 System.exit(0);

私のために働いた


1
コードに説明を追加してください。さらに、それがすでにあることをカバーして他の回答のように見える-あなたはまた、あなたのソリューションは、より良い他の人よりも作るかを説明する必要がありますので
ニコハーゼ

0

これを呼んでください:

finishAffinity();

このコードは質問に答えることができますが、このコードが質問に答える理由や方法に関する追加のコンテキストを提供すると、長期的な価値が向上します。
イゴールF.

0

このメソッドを終了/終了ボタンにリンクします

public void quitGame(View view) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            finishAndRemoveTask();
        } else {
            finish();
        }
    }

-1

終了と終了の両方を使用すると、アプリは完全に閉じます

finish();

System.exit(0);

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.