博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android 关于长按back键退出应用程序的实现
阅读量:6414 次
发布时间:2019-06-23

本文共 4121 字,大约阅读时间需要 13 分钟。

                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键功能。

转载地址:http://psdra.baihongyu.com/

你可能感兴趣的文章
Google Test and Google Mock Introduction
查看>>
linux的文件系统
查看>>
上云利器,K8S应用编排设计器之快到极致
查看>>
袋鼠云服务案例系列 | 从DB2到MySQL,某传统金融平台的互联网转型之路
查看>>
RealServer配置脚本
查看>>
九月份技术指标 华为交换机的简单配置
查看>>
马哥linux作业--第八周
查看>>
dubbo01
查看>>
python 写json格式字符串到文件
查看>>
QXORM 使用记录 ( 二 )
查看>>
分布式文件系统MogileFS
查看>>
电力线通信载波模块
查看>>
linux vim详解
查看>>
Java23种设计模式案例:策略模式(strategy)
查看>>
XML解析之DOM4J
查看>>
图解微服务架构演进
查看>>
SQL PATINDEX 详解
查看>>
一些常用的网络命令
查看>>
CSP -- 运营商内容劫持(广告)的终结者
查看>>
DIV+CSS命名规范有助于SEO
查看>>