开源中国安卓客户端源码学习(三) 按两次返回键退出程序
很多安卓程序都有按两次返回键退出的功能, 那么这个功能是怎样实现的呢?
开源中国用了一个辅助类.ui.DoubleClickExitHelper
类实现这个功能,其中涉及到了Android的Handler+Looper+MessageQueue消息机制, 网上有很多相关资源, 这个东西比较复杂, 日后还需要深入研究, 这里只需要大概知道其原理就可以了. 主要思想是在第一次按键时在MessageQueue中添加一个消息, 并给这个消息设置一个延时, 使其在2s后执行, 执行效果是取消第一次按键的影响. 若在2s内再次检测到有按键发生, 则退出程序. 具体的实现代码如下:
public class DoubleClickExitHelper {
private final Activity mActivity;
private boolean isOnKeyBacking = false;
private Handler mHandler;
private Toast mBackToast;
public DoubleClickExitHelper(Activity activity) {
mActivity = activity;
mHandler = new Handler(Looper.getMainLooper());
}
/**
* Activity onKeyDown事件
*
*/
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode != KeyEvent.KEYCODE_BACK) {
return false;
}
if (isOnKeyBacking) {
//2s内第二次按键
mHandler.removeCallbacks(onBackTimeRunnable);
if (mBackToast != null) {
mBackToast.cancel();
}
// 退出程序
AppManager.getAppManager().AppExit(mActivity);
return true;
} else {
// 第一次按键
isOnKeyBacking = true;
if (mBackToast == null) {
mBackToast = Toast.makeText(mActivity, R.string.back_exit_tips,
Toast.LENGTH_SHORT);
}
mBackToast.show();
mHandler.postDelayed(onBackTimeRunnable, 2000);
return true;
}
}
private Runnable onBackTimeRunnable = new Runnable() {
// 2s内没有再次按键则执行下面的 run 方法
@Override
public void run() {
isOnKeyBacking = false;
if (mBackToast != null) {
mBackToast.cancel();
}
}
};
}
在 .ui.Main
类中添加下面代码
private DoubleClickExitHelper mDoubleClickExitHelper;
@overide
public void onCreate(Bundle savedInstanceState) {
...
mDoubleClickExitHelper = new DoubleClickExitHelper(this);
....
}
// 在activity中监听按键事件
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
boolean flag = false;
if (keyCode == event.KEYCODE_BACK) {
return mDoubleClickExitHelper.onKeyDown(keyCode, event);
}
// TODO handle other key event
return flag;
}