安卓双击退出实现

前记

项目中用到了双击退出的功能,起初在Application中使用Stack在Activity基类中的onCreate中把activity压入栈中,在onDestroy中把activity弹出栈中,然后当用户要退出的时候再弹出Stack中的每一个Activity,但使用LeakCanary检测到严重的内存泄漏,全是由于这个Stack持有了Activity的强引用,导致内存无法释放,到最后就会拖垮应用。

解决方案

由于android中的Activity在默认加载模式下是一个栈结构,先进后出,后进先出,而要双击退出的地方只有主页才需要,所以代码很简单,重写主页的onKeyDown就行了,代码:

全局变量

private boolean isExit = false;//是否退出
private static final int EXIT_APP_INTERVAL = 2000;//退出程序时间间隔

onKeyDown代码
拦截返回键点击事件,返回true说明事件消费完毕,不再向上传递,因此不会结束Activity,如果想结束Activity直接return super.onKeyDown(keyCode,event)就行

   @Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        boolean flag = exitBy2Click() ? true : super.onKeyDown(keyCode, event);
        return flag;
    }
    return super.onKeyDown(keyCode, event);
}

exitBy2Click()代码
按第一下时启动定时器,两秒内如果用户没有再点击返回键则置全局变量isExit为false,如果用户两秒内点击了则说明要结束应用了,释放所有资源,结束本Activity,执行onDestroy销毁进程

 /**
 * 双击退出
 */
private boolean exitBy2Click() {
    Timer tExit = null;
    if (isExit == false) {
        isExit = true; // 准备退出
        Toast.makeText(MainActivity.this, R.string.toast_double_click_exit, Toast.LENGTH_SHORT).show();
        tExit = new Timer();
        tExit.schedule(new TimerTask() {
            @Override
            public void run() {
                isExit = false; // 取消退出
            }
        }, EXIT_APP_INTERVAL); // 如果2秒钟内没有按下返回键,则启动定时器取消掉刚才执行的任务
        return true;
    } else {
         //这里可以释放app的资源(数据库连接,下载任务等)
        return false;
    }
}

onDestroy
由于本Activity已经是栈底Activity了,执行onDestroy说明要退出应用了,所以在这里可以杀死进程

 android.os.Process.killProcess(android.os.Process.myPid());
 System.exit(0);

后记

网上的代码,取之有道,前人的代码不能瞎鸡巴用。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 转自 1. 什么是Activity? 四大组件之一,一般的,一个用户交互界面对应一个activity setCon...
    joe1632阅读 5,227评论 0 7
  • 哎呀呀 ,马上就要面临找工作了,媛媛心里紧张呀. 作为一个即将毕业的Android程序媛,开始面临找工作了,...
    左神话阅读 10,385评论 7 59
  • 1.什么是Activity?问的不太多,说点有深度的 四大组件之一,一般的,一个用户交互界面对应一个activit...
    JoonyLee阅读 11,013评论 2 51
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,376评论 25 709
  • 最近遇见了人生中比较少见的烦恼,乐天派的我实在是很少遇见这样的情况。 因为上一次已经真的错失了一次,错把相似的人当...
    月落巧无声阅读 916评论 0 1