开源中国Android源码剖析(2)

本文是开源中国Android源码分析的第二部分,主要探讨MainActivity及其内部使用的DoubleClickExitHelper组件,揭示其在应用程序退出策略上的实现细节。
摘要由CSDN通过智能技术生成

前言

很多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中是如何实现双击退出功能的。
/***
 * 双击退出
 * @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中都要用到,下次大家写程序的程序的时候,可以完全参考上面的做法~



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值