博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Oschina 安卓client源代码学习之中的一个
阅读量:7082 次
发布时间:2019-06-28

本文共 3188 字,大约阅读时间需要 10 分钟。

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

(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
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);优雅的。全然的结束掉整个程序。

转载地址:http://vslml.baihongyu.com/

你可能感兴趣的文章
Spring与Quartz的整合实现定时任务调度[转]
查看>>
Flume中的HDFS Sink配置参数说明【转】
查看>>
鼠标键盘录制软件
查看>>
23种设计模式之单例模式(Singleton)
查看>>
Mahout应用
查看>>
李洪强iOS开发之静态库的打包一
查看>>
树莓派3b配置耳机音频输出
查看>>
ES6 Class
查看>>
jquery click()方法模拟点击事件对a标签不生效
查看>>
python -- lambda表达式
查看>>
JS垃圾回收——和其他语言一样,JavaScript 的 GC 策略也无法避免一个问题:GC 时,停止响应其他操作,这是为了安全考虑...
查看>>
在centos搭建git服务器时,不小心把/home/git目录删除了,我是怎么恢复的
查看>>
Guava学习笔记:Google Guava 类库简介
查看>>
Linux shell脚本启动 停止 重启jar包
查看>>
给JAVA初学者的50个忠告
查看>>
goAhead 2.5嵌入式web服务器移植到arm9 2440 + linux中
查看>>
ASP.NET MVC4 Web API 堆栈将添加指定消息处理功能
查看>>
oracle - 循环
查看>>
Excel 连接字符串详解
查看>>
Begin End在oracle数据库中批量操作应用
查看>>