Android で誤ってアプリを終了させないようにするにはどうすればよいですか?
IE: 戻るボタンを押して BackStack の最後のアクティビティに到達したら、onBackPressed() メソッドを使用してユーザーが終了するかどうかを尋ねるトーストを表示します。
また、フラグメントの backStacks で機能する必要があります。
Android で誤ってアプリを終了させないようにするにはどうすればよいですか?
IE: 戻るボタンを押して BackStack の最後のアクティビティに到達したら、onBackPressed() メソッドを使用してユーザーが終了するかどうかを尋ねるトーストを表示します。
また、フラグメントの backStacks で機能する必要があります。
この機能は、メイン アクティビティの onBackPressed() メソッドをオーバーライドすることで簡単に実装できます。この例では、ユーザーが [戻る] ボタンを押すと、アプリは 4 秒間トーストを表示し、その後もう一度 [戻る] を押すとアプリがすぐに終了します。
次のように Activity を拡張する BaseActivity に配置できます。
public class BaseActivity extends Activity{
private Toast toast;
private long lastBackPressTime = 0;
. . .
/**
* Prevent accidental app exit by requiring users to press back twice when
* the app is exiting w/in 4sec
*/
@Override
public void onBackPressed() {
if (this.lastBackPressTime < System.currentTimeMillis() - 4000) {
toast = Toast.makeText(this, "Press back again to close this app", 4000);
toast.show();
this.lastBackPressTime = System.currentTimeMillis();
} else {
if (toast != null) {
toast.cancel();
}
super.onBackPressed();
}
}
. . .
}
編集:フラグメントバックスタックの互換性を追加
アプリケーションがフラグメントのみを使用している bacstack の最後のフラグメントを検出するために使用するには、dispatchKeyEvents を BaseActivity クラスに配置し、上記のメソッドを次のように実装することを強くお勧めします。
public class BaseActivity extends Activity {
public boolean dispatchKeyEvent(KeyEvent event) {
int backCount = getFragmentManager().getBackStackEntryCount();
int action = event.getAction();
int keyCode = event.getKeyCode();
FragmentManager fm = getFragmentManager();
. . .
case KeyEvent.KEYCODE_BACK :
if (action == KeyEvent.ACTION_DOWN && backCount == 0) {
onexitNotify();
}else {
fm.popBackStack();
}
return true;
default :
return super.dispatchKeyEvent(event);
}
}
/**
* Prevent accidental app exit by requiring users to press back twice when
* the app is exiting w/in 8sec
*/
private Toast toast;
private long lastBackPressTime = 0;
public void onexitNotify() {
if (this.lastBackPressTime < System.currentTimeMillis() - 8000) {
toast = Toast.makeText(this, "Press back again to close this app", 8000);
toast.show();
this.lastBackPressTime = System.currentTimeMillis();
} else {
if (toast != null) {
toast.cancel();
}
super.onBackPressed();
}
}
}
*2.0 以降を使用している場合、onBackPressed() は必要なコード量を簡素化するため、onKeyDown() は必要ありません。
Android のパターンごとの推奨事項:
一部のアプリケーションは、終了しようとしているときにユーザーにプロンプトを表示します。これは特にゲームアプリでよく見られるようです。この方法は、通常のアプリケーションでは推奨されません。確認プロンプトは、ユーザーの通常のワークフローを混乱させます。このオプションを使用するゲームでも、非常に慎重に検討する必要があります。
アプリのメイン アクティビティで戻るキーが押されたタイミングを確認できます。その後、ユーザーに警告ダイアログを表示して終了を確認できます。
public boolean onKeyDown(int keyCode, KeyEvent event) {
//Handle the back button
if(keyCode == KeyEvent.KEYCODE_BACK) {
checkExit();
return true;
}
else {
return super.onKeyDown(keyCode, event);
}
}
private void checkExit()
{
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("Are you sure you want to exit?")
.setCancelable(false)
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
//take actions here accordingly as the user has pressed yes
}
})
.setNegativeButton("No", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
});
AlertDialog alert = builder.create();
alert.show();
}