【问题标题】:How to Prevent Accidental App Exit w/in Android Fragments/Activities?如何防止在 Android 片段/活动中意外退出应用程序?
【发布时间】:2012-06-12 00:48:25
【问题描述】:

如何防止 Android 中的应用意外退出?

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

另外,它需要与片段的 backStacks 一起使用。

【问题讨论】:

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


    【解决方案1】:

    这个功能可以很容易地通过覆盖主要活动的 onBackPressed() 方法来实现。在此示例中,当用户按下后退按钮时,应用程序将显示 4 秒钟的 toast,在此期间,新的后退按钮会立即终止应用程序。

    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()。

    每个安卓模式推荐:

    一些应用程序在即将退出时提示用户。这似乎 在游戏应用中尤为常见。这种做法不 推荐在正常应用中。确认提示将 扰乱用户的正常工作流程。即使在使用此选项的游戏中也应该 慎重考虑。

    【讨论】:

    • onBackpressed 是在 API 级别 5 中引入的,而 keydown 是从 API 级别 1 开始的。此外,API 级别 5 是 Android 2.0。
    【解决方案2】:

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

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

    【讨论】:

    • 这是相同数量的代码,而不是使用 backpressed 我正在使用 keydown。其余部分用于创建警报对话框。根据您的目标受众,可能会错过祝酒词。屏幕上显示警报对话框,等待进一步操作。
    • 根据安卓模式推荐:一些应用程序在即将退出时提示用户。这似乎在游戏应用中尤为常见。在正常应用中不推荐这种做法。确认提示会破坏用户的正常工作流程。即使在使用此选项的游戏中也应该非常谨慎地考虑。
    猜你喜欢
    • 1970-01-01
    • 2022-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多