在源码中,火蚁完全封装了 双击退出程序的功能 : DoubleClickExitHelper类
该类的源码分析如下:
1 构造函数中传入了 设备上下文,实现退出功能的界面,完成消息处理器的初始化;既然要有提示条,那么也需要一个Toast对象。
2 既然完全封装,那么 我们需要将 按键的事件及按键码传进去,因为界面重写的onKeyDown 事件需要返回一个boolean值,那么在DoubleClickExitHelper类中也自定义了一个返回布尔值的onKeyDown 函数。
3onKeyDown 函数:
3.1 如果不是按下键,则返回false;isOnKeyBacking 为全局变量,初始化DoubleClickExitHelper对象时,默认值为false,第一次点击的时候,其值为false,则将isOnKeyBacking 置为true,完成Toast的初始化,利用handler.post(runnable)延时执行一个业务——如果Toast 还在显示 直接手动关闭。当第二次点击的时候isOnKeyBacking 已经为true,这个时候存在一种可能:runnable 延时执行的业务还没有执行(从源码中我们可以看到,这个时间是2秒,也就是说2秒内再次点击了返回键的话),我们可以先去掉延时要执行的任务,然后直接关闭Toast,在执行关闭界面的操作等等。执行完后返回true,代表响应了KeyDown事件。
3.2 此方法的优势除了封装性外,就是存在手动关闭Toast的情况,一般在用的时候,显示时间不是short 就是 long ,但是在关闭界面后,当Toast显示后 在关闭时找不到设备上下文的话,就存在着 程序退出了,但那个Toast 确一直显示着,本人曾经遇到过这个问题。
阅读代码,是一种良好的习惯,各位坚持!
来源:oschina
链接:https://my.oschina.net/u/163141/blog/525020