私のアプリケーションでは、戻るボタンを押したときにアプリを終了したい、これは私のコード:
@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();
}
戻るボタンを押して現在のアクティビティを終了すると(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秒以内に別のバックプレスがあれば、アプリケーションを閉じます。
これを試して:
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);
同じ問題がありました。1つのLoginActivityと1つのMainActivityがあります。 MainActivityで戻るボタンをクリックすると、アプリケーションを閉じる必要があります。 SO OnBackPressedメソッドを使用しました。このmoveTaskToBack()は、ホームボタンと同じように機能します。 Backスタックはそのままになります。
public void onBackPressed() {
// super.onBackPressed();
moveTaskToBack(true);
}
このアクティビティを開始すると、スタック内の以前のアクティビティを意味します。このアクティビティを呼び出す行の後にfinish();
を追加します。
以前のすべてのアクティビティで。次のような新しいアクティビティを開始するとき
startActivity(I);
この後にfinish();
を追加します。
私の理解では、GoogleはAndroidがメモリ管理とアプリのシャットダウンを処理することを望んでいます。コードからアプリを終了する必要がある場合は、Androidにガベージコレクターを実行するように依頼することをお勧めします。
@Override
public void onBackPressed(){
System.gc();
System.exit(0);
}
Finish()をコードに追加することもできますが、System.exit(0)を行う場合はおそらく冗長です。
Finishはアプリを閉じず、アクティビティを閉じるだけです。これがランチャーアクティビティである場合、アプリを閉じます。そうでない場合は、前のアクティビティに戻ります。
できることは、onActivityResultを使用して必要な数のfinish()をトリガーし、開いているすべてのアクティビティを閉じることです。
デフォルトではメソッド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);
}
戻るボタンを押してアプリを終了するには、最初に上位のアクティビティをすべてクリアしてから、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);
}
finish()
の代わりにsuper.onBackPressed()
を呼び出します