• Android 关于长按back键退出应用程序的实现


                    Android 关于长按back键退出应用程序的实现

         最近在做一个Android上的应用,碰到一个问题就是如何实现长按back键退出应用程序。在网上查找了很多资料,发现几乎没有这样的实现,大部分在处理时是双击back键来退出应用程序。参考了一下双击back键退出应用程序的代码,网上主流的一种方法是下面这种方法,实现起来比较简单:

    //代码来自:http://www.devdiv.com/home.php?mod=space&uid=67600&do=blog&id=7024
        @Override
        public boolean onKeyDown(int keyCode, KeyEvent event) 
        {
          if (keyCode == KeyEvent.KEYCODE_BACK) 
          {
            if ((System.currentTimeMillis() - mExitTime) > 2000) 
            {
              mHelperUtils.showToast(mContext, R.string.exit_content);
              mExitTime = System.currentTimeMillis();
            }
            else 
            {
              finish();
            }
            return true;
          }
          return super.onKeyDown(keyCode, event);
        }

       从上面的代码可以看出,采用的思路就是连续两次点击back键的时间间隔在2s以内,则认为是双击,从而退出程序。

       因此,借鉴上面的思路,我的最初想法是:可以重写onKeyDown方法和onKeyUp方法,计算这执行这两个方法之间的时间间隔,如果大于2s,则认为是长按,从而退出程序;否则,则执行back键原有的响应。按照这个思路:

    public boolean onKeyDown(int keyCode, KeyEvent event) 
    { 
            if (keyCode == KeyEvent.KEYCODE_BACK&&event.getRepeatCount()==0) 
            { 
                start=System.currentTimeMillis(); 
                Log.e("start",String.valueOf(start));
                return false; 
            } 
            
            return super.onKeyDown(keyCode, event);
        } 
        
        public boolean onKeyUp(int keyCode,KeyEvent event)
        {
            if (keyCode == KeyEvent.KEYCODE_BACK &&event.getRepeatCount()==0) 
            { 
                end=System.currentTimeMillis(); 
                Log.e("end",String.valueOf(end));
                
                if(start!=-1&&(end-start)>2000)
                {
                    AlertDialog.Builder builder = new Builder(MainActivity.this);
                    builder.setMessage("确认退出吗?");
                    builder.setTitle("提示");
                    builder.setPositiveButton("确认",new DialogInterface.OnClickListener()
                    {
                        public void onClick(DialogInterface dialog,int which)
                        {
                            dialog.dismiss();
                            MainActivity.this.finish();
                            System.exit(0);
                        }
                    });
    
                    builder.setNegativeButton("取消",new DialogInterface.OnClickListener() 
                    {
                        public void onClick(DialogInterface dialog,int which) 
                        {
                            dialog.dismiss();
                        }
                    });
                    builder.create().show();
                    return true;
                }
                else
                {
                    
                    return super.onKeyUp(keyCode, event);
                }
            }
            return super.onKeyUp(keyCode, event);
        }
      然而,这样能够实现长按back键退出程序,但是非长按back键的时候,点击back则失效了,查找了很多Android 按键事件分发和处理机制方面的资料,还是没弄清楚原因(后面有时间再研究)。于是考虑换一种思路去处理,考虑去重写Activity中的dispatchKeyEvent方法。
    
    public boolean dispatchKeyEvent(KeyEvent event)
       {
            int keyCode=event.getKeyCode();
            //Log.e("start",String.valueOf(start));
            switch(keyCode)
            {
                case KeyEvent.KEYCODE_BACK:
                if(event.isLongPress())   //这句很重要,判断事件是否是长按事件
                  {
                    AlertDialog.Builder builder = new Builder(MainActivity.this);
                    builder.setMessage("确认退出吗?");
                    builder.setTitle("提示");
                    builder.setPositiveButton("确认",new DialogInterface.OnClickListener()
                    {
                        public void onClick(DialogInterface dialog,int which)
                        {
                            dialog.dismiss();
                            MainActivity.this.finish();
                            System.exit(0);
                        }
                    });
    
                    builder.setNegativeButton("取消",new DialogInterface.OnClickListener() 
                    {
                        public void onClick(DialogInterface dialog,int which) 
                        {
                            dialog.dismiss();
                        }
                    });
                    builder.create().show();
                    return true;
                }
                return super.dispatchKeyEvent(event);  //如果不是长按,则调用原有方法,执行按下back键应有的处理
                default:
                    break;
            }
            return super.dispatchKeyEvent(event);
        }

      最后通过重写dispatchKeyEvent方法实现了长按back键退出程序,而且没有屏蔽掉原有的非长按back键功能。

  • 相关阅读:
    1058
    light oj 1067 费马小定理求逆元
    HDU 1022
    贪心
    HDU 4994 博弈。
    HDU 5234 背包。
    CodeForces 327B 水题。
    vue的$nextTick使用总结,this.$refs为undefined的解决办法,element Ui的树形控件setCheckedKeys方法无法使用
    Object.assign的用法
    react + antd 实现打印功能(踩了不少坑)
  • 原文地址:https://www.cnblogs.com/dolphin0520/p/2623763.html
Copyright © 2020-2023  润新知