双击提示退出程序的实现与分析

去年年底在学android写demo的时候,又一次想要学着写一次双击退出的逻辑,但是当时看到好几十行的代码和逻辑当场就怂了,不过最近在做项目的时候,突然想到这个逻辑,就想着找来看看,然后发现还是相当简单的~~~啦啦啦~~~

很容易想到这里需要一个定时器,来为我们开启一个异步计时的任务:

   @Override
    public void onBackPressed() {
        exitBy2Click();
    }

    private void exitBy2Click() {
        Timer tExit= null;//计时器定义,建议将该变量写入活动的成员变量中,避免了栈内存的浪费;在这里置空可以达到释放堆内存的效果,防止OOM
        if (!isExit){//为假,初始化计时器开始计时,为真表示延时任务未被执行,而进入了else
            isExit= true;//开始计时的标识
            Toast.makeText(this, "再按一次退出程序",Toast.LENGTH_SHORT).show();
            tExit= new Timer();

            tExit.schedule(new TimerTask() {//计划一个延时任务
                @Override
                public void run() {//该任务被执行,则表示两秒之内没有再次触发onBackPressed方法,isExit标记被重置为假。本次为时2s的倒计时结束
                    isExit= false;
                }
            },2000);//两秒之后执行run里的代码块,结束本次对第二次连击的监听(异步执行计时任务,也可以理解为对子线程的一个sleep)
        }else {
            finish();
            System.exit(0);//鉴于活动栈里没有活动了,可暂时不使用这段强制退出代码,不过还是建议使用
        }
    }

其中的exitBy2Click 是我们的核心代码~~~其实核心也就是一个延时任务+标记量

具体的逻辑在注释里已经详细说明了,同样对返回键的监听我们也可以使用
onKeyDown来监听具体的按键事件......

  @Override//监听返回键
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode== KeyEvent.KEYCODE_BACK){
            exitBy2Click();
        }
        return false;
    }

当然啦,核心逻辑的实现也可以使用Handler的postdelayed来实现,其中的Handler对象的作用等同于Timer对象,所以我只贴出一个简单demo,留下的由博友们自行脑补吧

<span style="font-size:14px;">new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {

            }
        },2000);</span>
时间: 2024-10-28 11:42:24

双击提示退出程序的实现与分析的相关文章

升级后开机就提示“android.process.acore”停止执行 --分析 解决方式

OTA升级的,升级引发的全部问题都是能够解释的,有的能解决,有的不能解决. 一个项目报了这个问题. 升级后开机就提示"android.process.acore"停止执行 抓取 adb log 看到了 以下的这个 fatal  的log 11-06 14:40:33.633  3827  3827 E AndroidRuntime: FATAL EXCEPTION: main 11-06 14:40:33.633  3827  3827 E AndroidRuntime: Proces

升级后开机就提示“android.process.acore”停止运行 --分析 解决方案

OTA升级的,升级引发的所有问题都是可以解释的,有的能解决,有的不能解决. 一个项目报了这个问题.升级后开机就提示"android.process.acore"停止运行 抓取 adb log 看到了 下面的这个 fatal  的log 11-06 14:40:33.633  3827  3827 E AndroidRuntime: FATAL EXCEPTION: main 11-06 14:40:33.633  3827  3827 E AndroidRuntime: Process

移动硬盘属性0字节RAW,双击提示文件或目录损坏且无法读取

很多时候因为一些误操作导致移动硬盘损坏,打不开提示文件或目录损坏好.或者提示未格式化等等.这时候想恢复里面的数据,就不要尝试格式化硬盘 .市面上的大部分数据恢复软件都无法显示这些打不开的盘,恢复更无从下手了.这时可以用我们的曙光数据恢复软件DawnDataRecovery恢复丢失的数据. 第一步:我们需要知道需要恢复的分区所对应的物理硬盘是哪个,方法有  右击桌面的我的电脑(计算机)图标"-"管理"-"磁盘管理"  ,可以看到需要恢复的F盘 是在磁盘1中

用VS2010编写的C++程序,在其他电脑上无法运行,提示缺少mfc100.dll的解决办法

问题: 在自己电脑上用VS2010编写的VC++程序(使用MFC库),不能在其他电脑上运行.双击提示: "无法启动此程序,因为计算机中丢失mfc100.dll 尝试重新安装该程序以解决此问题." 解决方案: 方案一 采用静态编译使用VS2010编译的程序在windowsxp中运行时,经常会出现找不到相关的DLL文件,我们可以使用静态编译的方法把这些运行依赖文件打包到*.exe中来,以减少对环境的依赖. 一般可以配置以下两项: 项目 -< **属性 -< 配置属性-<

在 NetBeans IDE 6.0 中分析 Java 应用程序性能

NetBeans IDE 6.0 包含一个强大的性能分析工具,可提供与应用程序运行时行为有关的重要信息.通过 NetBeans 性能分析工具,我们可以方便地在 IDE 中监控应用程序的线程状态.CPU 性能以及内存使用情况,而且产生的开销相对较少. 本文将概述 IDE 中包含的性能分析工具,并指导您快速开始分析 NetBeans 项目的性能.本文旨在演示 IDE 中可用的各种性能分析任务以及分析项目性能时可以获得的分析结果.但并不覆盖 IDE 中包含的所有性能分析功能,也不会深入探索如何研究性能

linux实践之程序破解

linux实践之程序破解 这次的实践是文件破解,让我们从login可执行文件开始吧! 首先我们执行一下这个可执行程序 ①我们希望在不知道密码的情况下,能够登陆进去.且无论密码是什么,都是提示“on your command,my master!”. 首先对该程序执行反汇编. 我们首先要找到main函数的入口处. 我们可以看到cmp语句后,有jmp语句,如果不等于就跳转到“0x8048466”处,这是正常程序执行的过程,我们在这里希望不等于的时候,也不要跳转,所以可以把“75 0e”修改为“75

GDI 泄漏检测方法

方法一 1.打开电脑的[任务管理器],选择[进程]页,点击菜单项的[查看]项,选择[选择列]: 2.勾选[GDI对象(J)]即可. 3.此时,用户就可以在进程中看到每个进程对应的GDI对象,每个进程的GDI对象(网页浏览器除外,每打开一个网页GDI对象都会增加)基本上是一定的,如果不断上涨,则说明程序存在GDI泄漏问题. 方法二 使用检测工具GDIndicator,支持win7+xp 1.启动待检测的程序和GDIndicator,启动顺序没有要求,之后F5刷新,就能看到系统中所有进程,和使用的资

1202实验三 进程调度实验

一.实验目的 用高级语言完成一个进程调度程序,以加深对进程的概念及进程调度算法的理解. 二.实验内容和要求 1.要求:设计一个有 N(N不小于5)个进程并发执行的进程调度模拟程序. 进程调度算法:“时间片轮转法”调度算法对N个进程进行调度. 2.完成两个算法(简单时间片轮转法.多级反馈队列调度算法)的设计.编码和调试工作,完成实验报告. 1) 每个进程有一个进程控制块(PCB)表示.进程控制块包含如下信息:进程名.优先级.到达时间.需要运行时间.已用CPU时间.进程状态等等. 2) 每个进程的状

Android工具:LeakCanary—内存泄露检测神器

一.LeakCanary简介LeakCanary是Square公司开源的一个检测内存的泄露的函数库,可以方便地和你的项目进行集成,在Debug版本中监控Activity.Fragment等的内存泄露:LeakCanary集成到项目中之后,在检测到内存泄露时,会发送消息到系统通知栏.点击后打开名称DisplayLeakActivity的页面,并显示泄露的跟踪信息,Logcat上面也会有对应的日志输出.同时如果跟踪信息不足以定位时,DisplayLeakActivity还为开发者默认保存了最近7个d