如何在Android片段/活动中防止意外的应用程序退出?

时间:2012-06-07 22:27:52

标签: android android-fragments android-activity android-event back-stack

如何在Android中防止意外应用程序退出?

IE:当他/她按下后退按钮并到达BackStack中的最后一个活动时,显示一个toast,询问用户是否想要使用onBackPressed()方法退出。

此外,它需要使用backStacks来处理片段。

2 个答案:

答案 0 :(得分:2)

通过覆盖主要活动的onBackPressed()方法可以轻松实现此功能。在此示例中,当用户按下后退按钮时,应用程序将显示一个4秒的祝酒词,此时新的后退按钮会立即终止该应用程序。

ref

您可以将它放在扩展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()。

Per androd模式推荐:

  

某些应用程序在即将退出时会提示用户。这似乎是   在游戏应用中尤为常见。这种做法不是   在正常应用中推荐。确认提示会   扰乱用户的正常工作流程。即使在使用此选项的游戏中也应该   要经过深思熟虑。

答案 1 :(得分:0)

您可以在应用的主要活动中检查何时按下后退键。然后,您可以向用户显示alertdialog以确认退出。

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();       
}