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

(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全部activity的stackactivityStack

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

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

Oschina 安卓client源代码学习之中的一个的更多相关文章

  1. 开源中国安卓client源代码学习(一) 渐变启动界面

    开源中国安卓client源代码学习(一) 渐变启动界面 准备学习安卓开发, 看到网上有人推荐开源中国安卓client的源代码, 说里面包括了大部分技术, 于是准备好好研究研究. 特开通此系列博客来记录 ...

  2. netty深入学习之中的一个: 入门篇

    netty深入学习之中的一个: 入门篇 本文代码下载: http://download.csdn.net/detail/cheungmine/8497549 1)Netty是什么 Netty是Java ...

  3. input子系统驱动学习之中的一个

        刚開始学习linux这门课就被分配编写一个设备的input子系统驱动.这对我的确有点困难.只是实际的操作中发现困难远比我想象的要大的多.本以为依照老师课上的步骤就行非常快的完毕这项任务.后来发 ...

  4. Spark源代码分析之中的一个:Job提交执行总流程概述

    Spark是一个基于内存的分布式计算框架.执行在其上的应用程序,依照Action被划分为一个个Job.而Job提交执行的总流程.大致分为两个阶段: 1.Stage划分与提交 (1)Job依照RDD之间 ...

  5. Python 学习之中的一个:在Mac OS X下基于Sublime Text搭建开发平台包括numpy,scipy

    1 前言 Python有许多IDE能够用,官方自己也带了一个,Eclipse也能够. 但我在使用各种IDE之后,发现用Sublime Text是最好用的一个.因此.我都是用Sublime Text来编 ...

  6. Java并发学习之中的一个——线程的创建

    本文是学习网络上的文章时的总结,感谢大家无私的分享. 1.与每一个Java语言中的元素一样,线程是对象.在Java中,我们有两种方式创建线程: a.通过直接继承thread类,然后覆盖run方法. b ...

  7. Scapy基础学习之中的一个

    关于Scapy Scapy的是一个强大的交互式数据包处理程序(使用python编写). 它可以伪造或者解码大量的网络协议数据包,可以发送.捕捉.匹配请求和回复包等等.它可以非常easy地处理一些典型操 ...

  8. SSH学习之中的一个 OpenSSH基本使用

    在Linux系统中.OpenSSH是眼下最流行的远程系统登录与文件传输应用,也是传统Telenet.FTP和R系列等网络应用的换代产品. 当中,ssh(Secure Shell)能够替代telnet. ...

  9. mysql学习之中的一个:mysql安装

    我用的时mac系统,本来想在mac系统上装一个,可是发现mac系统始终无法用password登入到本机server,很奇怪的问题(在stackflow上看了些回复,也没有找到原因),最后仅仅好装到虚拟 ...

随机推荐

  1. html 中shadow DOM 的使用

    什么是shadow DOM? An important aspect of web components is encapsulation — being able to keep the marku ...

  2. WebRequest多线程 超时问题

    using System; using System.Collections; using System.Collections.Generic; using System.Net; using Sy ...

  3. (转)[unity3d]easytouch的使用

    对于移动平台上的RPG类的游戏,我们常用虚拟摇杆来控制人物角色的行走和一些行为,相信我们对它并不陌生,之前尝试了EasyTouch2.5,发现并没有最新版的3.1好用,2.5版本的对于自适应没有做的很 ...

  4. 如何做windows server 2008 R2 的磁盘清理

    参考如下的链接: https://technet.microsoft.com/en-us/library/ff630161(v=ws.10).aspx 运行后可能没有啥反应,磁盘空间也没增大.那是因为 ...

  5. [Node.js]30. Level 6: Listen 'Question' from client, and then Answer the Question

    Clients can also answer each other questions, so let's build that feature by first listening for the ...

  6. MySQL监控主要指标及采集方法

    MySQL监控属于DB监控的模块之一,包括采集.展示.监控告警.本文主要介绍MySQL监控的主要指标和采集方法. MySQL监控和Redis监控的逻辑类似,可参考文章<Redis监控主要指标及采 ...

  7. 【nodejs】修改了下对股票表进行crud操作的代码

    表是这样的: id是自增长字段,code和name都是255位的varchar. 下面是主角app.js的代码: 'use strict'; var express=require('express' ...

  8. Bootstrap3免费单页面模板-Shuffle

    在线演示 本地下载 这是一款当前最热门的模板,单页面模板现在越来越时兴,它简洁的页面和每一次滑动都带来的全新视角.非常值得收藏和使用!

  9. 自定义self.editButtonItem 改变自定义self.editButtonItem的背景图片

    一: // UIButton *editSome; 为全局变量,已开启ARC; editSome = [UIButton buttonWithType:UIButtonTypeCustom]; edi ...

  10. java 设计模式大全

    在线学习网址: http://www.runoob.com/design-pattern/