web-dev-qa-db-ja.com

Android:戻るボタンを押すとアプリケーションを終了します

私のアプリケーションでは、戻るボタンを押したときにアプリを終了したい、これは私のコード:

@Override
    public void onBackPressed() {
        new AlertDialog.Builder(this).setIcon(Android.R.drawable.ic_dialog_alert).setTitle("Exit")
                .setMessage("Are you sure you want to exit?")
                .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        finish();
                    }
                }).setNegativeButton("No", null).show();
    }

それは正常に動作しますが、アプリを終了すると完全に終了せず、アプリのロゴが表示された空のページが表示されます。アプリから戻るボタンをもう一度押すと、どうすれば修正できますか?

編集:

上記の代わりにこのコードを使用しますが、アプリは完全に終了しますが、バックグラウンドで実行し、完全に終了しないようにするには、どうすればよいですか?

@Override
    public void onBackPressed() {
        new AlertDialog.Builder(this).setIcon(Android.R.drawable.ic_dialog_alert).setTitle("Exit")
                .setMessage("Are you sure?")
                .setPositiveButton("yes", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {

                        Intent intent = new Intent(Intent.ACTION_MAIN);
                        intent.addCategory(Intent.CATEGORY_HOME);
                        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                        startActivity(intent);
                        finish();
                    }
                }).setNegativeButton("no", null).show();
    } 
37
Elham Gdz

戻るボタンを押して現在のアクティビティを終了すると(Aなど)、アプリのロゴに空白のアクティビティが表示されます(Bなど)。これは、Aを終了した後に表示されるアクティビティBがバックスタックに残っていることを意味します。 AはアクティビティBから開始されたため、アクティビティでは、フラグを付けてアクティビティAを開始する必要があります。

Intent launchNextActivity;
launchNextActivity = new Intent(B.class, A.class);
launchNextActivity.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
launchNextActivity.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);                  
launchNextActivity.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
startActivity(launchNextActivity);

これで、アクティビティAはスタックの一番上にあり、アプリケーションの他のアクティビティはバックスタックにありません。

アプリを閉じるためにonBackPressedを実装するアクティビティAで、次のようなことができます。

private Boolean exit = false;
@Override
    public void onBackPressed() {
        if (exit) {
            finish(); // finish activity
        } else {
            Toast.makeText(this, "Press Back again to Exit.",
                    Toast.LENGTH_SHORT).show();
            exit = true;
            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    exit = false;
                }
            }, 3 * 1000);

        }

    }

ここのハンドラーは偶発的なバックプレスを処理し、単にToastを表示します。3秒以内に別のバックプレスがあれば、アプリケーションを閉じます。

103
Rachit Mishra

これを試して:

Intent intent = new Intent(Intent.ACTION_MAIN);
          intent.addCategory(Intent.CATEGORY_HOME);
          intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);//***Change Here***
          startActivity(intent);
          finish();
          System.exit(0);
44

同じ問題がありました。1つのLoginActivityと1つのMainActivityがあります。 MainActivityで戻るボタンをクリックすると、アプリケーションを閉じる必要があります。 SO OnBackPressedメソッドを使用しました。このmoveTaskToBack()は、ホームボタンと同じように機能します。 Backスタックはそのままになります。

public void onBackPressed() {
  //  super.onBackPressed();
    moveTaskToBack(true);

}
19
Tara

このアクティビティを開始すると、スタック内の以前のアクティビティを意味します。このアクティビティを呼び出す行の後にfinish();を追加します。

以前のすべてのアクティビティで。次のような新しいアクティビティを開始するとき

startActivity(I);

この後にfinish();を追加します。

5
Kanwaljit Singh

私の理解では、GoogleはAndroidがメモリ管理とアプリのシャットダウンを処理することを望んでいます。コードからアプリを終了する必要がある場合は、Androidにガベージコレクターを実行するように依頼することをお勧めします。

@Override
public void onBackPressed(){
    System.gc();
    System.exit(0);
}

Finish()をコードに追加することもできますが、System.exit(0)を行う場合はおそらく冗長です。

3
Matti

Finishはアプリを閉じず、アクティビティを閉じるだけです。これがランチャーアクティビティである場合、アプリを閉じます。そうでない場合は、前のアクティビティに戻ります。

できることは、onActivityResultを使用して必要な数のfinish()をトリガーし、開いているすべてのアクティビティを閉じることです。

1
gian1200

デフォルトではメソッドfinish()を呼び出す戻るボタンを押した後に特定のアクティビティが表示されないように、manifest.xmlでnoHistory = "true"を推奨している人はいないようです。

これは私のために働いています。他の答えを組み合わせることで自分で見つけました

private Boolean exit = false;
@override
public void onBackPressed(){ 
    if (exit) {
        finish(); // finish activity
    } 
    else {
        Toast.makeText(this, "Press Back again to Exit.",
            Toast.LENGTH_SHORT).show();
         exit = true;
         new Handler().postDelayed(new Runnable() {

         @Override
         public void run() {
             // TODO Auto-generated method stub
             Intent a = new Intent(Intent.ACTION_MAIN);
             a.addCategory(Intent.CATEGORY_HOME);
             a.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
             startActivity(a);
        }
    }, 1000);
}
1
Bivin

戻るボタンを押してアプリを終了するには、最初に上位のアクティビティをすべてクリアしてから、Android電話のACTION_MAINを開始する必要があります

したがって、これらのコードをすべて記述する必要があるのは、以下のとおりです。

注:あなたの場合、MainActivityはYourActivityに置き換えられます

@Override
public void onBackPressed() {

        new AlertDialog.Builder(this)
                .setTitle("Really Exit?")
                .setMessage("Are you sure you want to exit?")
                .setNegativeButton(Android.R.string.no, null)
                .setPositiveButton(Android.R.string.yes, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        MainActivity.super.onBackPressed();
                        quit();
                    }
                }).create().show();
    }


public void quit() {
        Intent start = new Intent(Intent.ACTION_MAIN);
        start.addCategory(Intent.CATEGORY_HOME);
        start.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        start.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(start);
    }
0

finish()の代わりにsuper.onBackPressed()を呼び出します

0
Shashika