前言
前言
很多Android应用都有双击退出的功能,连着点击两次返回按键,会退出一个应用程序。第一次点击的时候会弹出类似“再次点击,退出XX应用”的提示信息,再次按下返回按钮,就退出APP回到主界面。今天我们就研究下,双击退出程序在Oschina中是如何实现的。
MainActivity
还是从源码开始,在MainActivity主activity类中initView()的操作中初始化了类DoubleClickExitHelper,按键的重写事件onKeyDown()对按下返回键的操作,都返回到mDoubleClickExit.onKeyDown中去处理:
/**
* 监听返回--是否退出程序
*/
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
// 是否退出应用
if (AppContext.get(AppConfig.KEY_DOUBLE_CLICK_EXIT, true)) {
return mDoubleClickExit.onKeyDown(keyCode, event);
}
}
return super.onKeyDown(keyCode, event);
}
DoubleClickExitHelper
实现双击退出的功能就是在该类DoubleClickExitHelper中。我们再看下DoubleClickExitHelper中是如何实现双击退出功能的。
代码理解起来应该不难,简单来说就是监听返回键。第一次按下的时候,用mBackToast.show();显示一个提示文字。这里是“再按一次退出开源中国”。持续时间2000ms。同时用这个mHandler.postDelayed开启一个异步操作,延迟时间也是2000ms。也就是说文字消失的时候这个RunnableonBackTimeRunnable就会去调用run方法。isOnKeyBacking的值变为false。也就是说2s之后你的第二次点击没有操作的话。一切回到原点。而如果你一旦在2s内再次点击的的话。就会调用到AppManager.getAppManager().AppExit(mActivity);程序就退出了。
/***
* 双击退出
* @author FireAnt(http://my.oschina.net/LittleDY)
* @created 2015年1月5日 下午7:07:44
*
*/
public class DoubleClickExitHelper {
private final Activity mActivity;
private boolean isOnKeyBacking;
private Handler mHandler;
private Toast mBackToast;
public DoubleClickExitHelper(Activity activity) {
mActivity = activity;
mHandler = new Handler(Looper.getMainLooper()); //放到主UI线程去处理
}
/**
* Activity onKeyDown事件
* */
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode != KeyEvent.KEYCODE_BACK) {
return false;
}
if(isOnKeyBacking) {
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.tip_double_click_exit, 2000);
}
mBackToast.show();
mHandler.postDelayed(onBackTimeRunnable, 2000); /* 2s一次的定时器 */
return true;
}
}
private Runnable onBackTimeRunnable = new Runnable() {
@Override
public void run() {
isOnKeyBacking = false;
if(mBackToast != null){
mBackToast.cancel();
}
}
};
}
代码理解起来应该不难,简单来说就是监听返回键。第一次按下的时候,用mBackToast.show();显示一个提示文字。这里是“再按一次退出开源中国”。持续时间2000ms。同时用这个mHandler.postDelayed开启一个异步操作,延迟时间也是2000ms。也就是说文字消失的时候这个RunnableonBackTimeRunnable就会去调用run方法。isOnKeyBacking的值变为false。也就是说2s之后你的第二次点击没有操作的话。一切回到原点。而如果你一旦在2s内再次点击的的话。就会调用到AppManager.getAppManager().AppExit(mActivity);程序就退出了。
那么AppManager.getAppManager().AppExit(mActivity);是如何完美退出OSCHINA应用程序的呢。这就要回到开源中国Android源码剖析(1)中提到的activity管理类AppManager了,它的getAppManager()方法获取到AppManager这个类的一个单例,然后AppExit()方法完成两个功能,一个是结束系统申请的所有activity,另外一个是调用系统应用android.os.Process.killProcess(android.os.Process.myPid())杀死oschina这个进程,这样就优雅的实现了退出APP的功能。完整的AppManager类的实现代码可以参考上一篇文章,贴出这两个方法的实现:
/**
* 单一实例
*/
public static AppManager getAppManager() {
if (instance == null) {
instance = new AppManager();
}
return instance;
}
/**
* 退出应用程序
*/
public void AppExit(Context context) {
try {
finishAllActivity();
// 杀死该应用进程
android.os.Process.killProcess(android.os.Process.myPid());
System.exit(0);
} catch (Exception e) {
}
}
该功能在很多android APP中都要用到,下次大家写程序的程序的时候,可以完全参考上面的做法~