• Oschina 安卓client源代码学习之中的一个


    今天主要研究一下两个功能

    (1)双击返回键退出程序

    (2)接近完美地退出程序


    (1)

    在非常多应用程序里都有一个功能,就是点击返回键,之后提示你再点击返回键就退出程序。

    之前一直非常好奇这是怎么实现的,今天正好把开源中国安卓client源代码扒下来了,所以就在这里研究一下这个非常easy的功能。

    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());//关键之处
    	}
    	
    	/**
    	 * 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 默认值为 false。所以第一次点击进入这里
    		//java boolean型是有默认值的
    			isOnKeyBacking = true;
    			if(mBackToast == null) {
    				mBackToast = Toast.makeText(mActivity, R.string.back_exit_tips, 2000);
    			}
    			mBackToast.show();
    			mHandler.postDelayed(onBackTimeRunnable, 2000);
    			return true;
    		}
    	}
    	
    	private Runnable onBackTimeRunnable = new Runnable() {
    		
    		@Override
    		public void run() {
    			isOnKeyBacking = false;
    			if(mBackToast != null){
    			//Android中用Toast.cancel()方法优化toast内容的显示
    			//详细能够百度
    				mBackToast.cancel();
    			}
    		}
    	};

    简单来理解就是监听返回键。第一次按下的时候。用mBackToast.show();显示一个提示文字。

    这里是“再按一次退出开源中国”。持续时间2000ms

    同一时候用这个mHandler.postDelayed开启一个异步操作,延迟时间也是2000ms。也就是说文字消失的时候这个RunnableonBackTimeRunnable就会去调用run方法。isOnKeyBacking的值变为false。也就是说2s之后你的第二次点击没有操作的话。一切回到原点。

    而假设你一旦在2s内再次点击的的话。

    AppManager.getAppManager().AppExit(mActivity);

    程序就退出了。


    使用的时候呢

    mDoubleClickExitHelper=newDoubleClickExitHelper(this);


    在须要支持这个双击退出的activity里,把onkeydown事件往下分发:

    /**
    	 * 监听返回--是否退出程序
    	 */
    	public boolean onKeyDown(int keyCode, KeyEvent event) {
    		boolean flag = true;
    		if (keyCode == KeyEvent.KEYCODE_BACK) {
    			// 是否退出应用
    			return mDoubleClickExitHelper.onKeyDown(keyCode, event);
    		} else if (keyCode == KeyEvent.KEYCODE_MENU) {
    			// 展示快捷栏&推断是否登录
    			UIHelper.showSettingLoginOrLogout(Main.this,
    					mGrid.getQuickAction(0));
    			mGrid.show(fbSetting, true);
    		} else if (keyCode == KeyEvent.KEYCODE_SEARCH) {
    			// 展示搜索页
    			UIHelper.showSearch(Main.this);
    		} else {
    			flag = super.onKeyDown(keyCode, event);
    		}
    		return flag;
    	}

    这样就实现了整个功能。


    (2)接近完美地退出程序

    接下来呢,就分析一下开源中国client这个退出功能。即上文

    AppManager.getAppManager().AppExit(mActivity);这个函数的实现


    private static Stack<Activity> activityStack;
    
    /**
    	 * 退出应用程序
    	 */
    	public void AppExit(Context context) {
    		try {
    			finishAllActivity();
    			ActivityManager activityMgr= (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    			//android2.2之后应该用killBackgroundProcesses (String packageName)
    			activityMgr.restartPackage(context.getPackageName());
    			System.exit(0);
    		} catch (Exception e) {	}
    	}
    
    /**
    	 * 结束全部Activity
    	 */
    	public void finishAllActivity(){
    		for (int i = 0, size = activityStack.size(); i < size; i++){
                if (null != activityStack.get(i)){
                	activityStack.get(i).finish();
                }
    	    }
    		activityStack.clear();
    	}

    贴出关键源代码大家就明确了吧。有个存放app全部activitystackactivityStack

    当然加入activity的源代码没贴出来。

    在应用程序退出的时候呢,就是遍历一下这个stack。然后挨个调用finish()。最后再调用System.exit(0);优雅的。全然的结束掉整个程序。





  • 相关阅读:
    昇腾AI处理器软件栈--任务调度器(TS)
    [转]shopnc 版权问题
    关于对接诸葛IO 解决的问题
    Mysql中like查询中存在反斜杠的解决方法
    关于TP,PHP和shopnc 的cookie
    TypeError: document.getElementById(…).submit is not a function解决
    关于图片上传的 相对路径出现问题
    Android 通讯录
    关于kindedit和 Uedit后者兼容前者
    Handler机制
  • 原文地址:https://www.cnblogs.com/yutingliuyl/p/7353365.html
Copyright © 2020-2023  润新知