现在的APP退出的时候都不是让用户点击了“后退键”就退出。防止用户点错了后退键而造成的用户体检不好。

一年前搞的Demo代码不见了,重新写下就当是复习和以后直接拿来用把

目前流行的解决一般分为两种:

一、按一次后退键显示一个对话框决定是否退出

     @Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
//点击了后退键
if(keyCode == KeyEvent.KEYCODE_BACK)
{
//创建对话框构建器对象
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("温馨提示")//对话框标题
.setMessage("确定要退出么?")//对话框内容
.setIcon(R.drawable.ic_launcher)//对话框图标
.setCancelable(false) //点击对话框之外的部分是否取消对话框
.setPositiveButton("确定", new OnClickListener() { @Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
finish();//结束当前Activity
}
})
.setNegativeButton("取消", new OnClickListener() { @Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
dialog.dismiss();//取消对话框
}
});
//生成对话框
Dialog dialog = builder.create();
//显示对话框
dialog.show();
} return super.onKeyDown(keyCode, event);
}

二、连续按两次后退键退出,一般两次按键时间间隔为2秒

(1)一般思路方法:

思路。一个应用程序第一次按后退键为 “第一次”  之后的每次按后退键:对于上一次为“第二次”,对于下一次为"第一次" ,判断两次按键时间的差的绝对值是否小于2000(毫秒)

 public class MainActivity extends Activity {
long timefirst = ; //一定要是long类型的
long timesecond = ;
boolean isKeyBack = false;//当为false ,为应用程序第一次按后退键,第一次按键之后 永为true ,
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
} @Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// TODO Auto-generated method stub if(keyCode == KeyEvent.KEYCODE_BACK)//如果点击了撤退键
{
if(isKeyBack==true) //如果isKeyBack==true 说明第二次点击后退键
{
timesecond = System.currentTimeMillis();//记录第二次按键的时间
System.out.println(""+timesecond); if(Math.abs(timesecond-timefirst)<)//说明两次按键间隔小于2秒,满足退出条件,退出Activity
{
finish();
}
else
{
timefirst = System.currentTimeMillis();//记录第一次按键的时间
Toast.makeText(this, "再按一次退出程序", ).show();
//不满足条件,则设置此次为第一次按键,因为isKeyBack为true
//屏蔽后退键的撤销功能
return true;
}
}
else if(isKeyBack==false) //如果isKeyBack为false 说明第一次点击后退键
{
timefirst = System.currentTimeMillis();//记录第一次按键的时间
Toast.makeText(this, "再按一次退出程序", ).show();
System.out.println(""+timefirst);
isKeyBack = true;
//屏蔽后退键的撤销功能
return true; }
} return super.onKeyDown(keyCode, event);
}

(2)优化方法

 public class MainActivity extends Activity {
long timefirst = ; //一定要是long类型的
long timesecond = ;
boolean isKeyBack = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
} @Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
if(keyCode==KeyEvent.KEYCODE_BACK)
{
timesecond = System.currentTimeMillis(); //记录当前按键时间,相当于上一次为第二次按键
if(timesecond-timefirst<) //如果两次按键时间小于2000毫秒,结束应用程序
{
finish();
}
else
{
Toast.makeText(this, "再按一次退出程序", ).show();
timefirst = timesecond; //如果不能退出,则当前按键时间设为第一次,下一次为第二次
return true; //屏蔽后退键的效果 return false;也可以 ,只要不让方法执行super.onKeyDown(keyCode, event);即可
   }   }  return super.onKeyDown(keyCode, event);  }

全部代码:

 package com.example.menu;

 import android.os.Bundle;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.view.KeyEvent;
import android.view.Menu;
import android.widget.Toast; public class MainActivity extends Activity {
long timefirst = ; //一定要是long类型的
long timesecond = ;
boolean isKeyBack = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
} @Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
if(keyCode==KeyEvent.KEYCODE_BACK)
{
timesecond = System.currentTimeMillis(); //记录当前按键时间,相当于上一次为第二次按键
if(timesecond-timefirst<) //如果两次按键时间小于2000毫秒,结束应用程序
{
finish();
}
else
{
Toast.makeText(this, "再按一次退出程序", ).show();
timefirst = timesecond; //如果不能退出,则当前按键时间设为第一次,下一次为第二次
return true; //屏蔽后退键的效果
}
}
return super.onKeyDown(keyCode, event);
} // @Override
// public boolean onKeyDown(int keyCode, KeyEvent event) {
// // TODO Auto-generated method stub
//
// if(keyCode == KeyEvent.KEYCODE_BACK)//如果点击了撤退键
// {
// if(isKeyBack==true) //如果isKeyBack==true 说明第二次点击后退键
// {
// timesecond = System.currentTimeMillis();//记录第二次按键的时间
// System.out.println("2"+timesecond);
//
// if(Math.abs(timesecond-timefirst)<2000)//说明两次按键间隔小于2秒,满足退出条件,退出Activity
// {
// finish();
// }
// else
// {
// timefirst = System.currentTimeMillis();//记录第一次按键的时间
// Toast.makeText(this, "再按一次退出程序", 1).show();
// //不满足条件,
// return true;
// }
// }
// else if(isKeyBack==false) //如果isKeyBack为false 说明第一次点击后退键
// {
// timefirst = System.currentTimeMillis();//记录第一次按键的时间
// Toast.makeText(this, "再按一次退出程序", 1).show();
// System.out.println("1"+timefirst);
// isKeyBack = true;
// return true;
//
// }
// }
//
// return super.onKeyDown(keyCode, event);
// } // @Override
// public boolean onKeyDown(int keyCode, KeyEvent event) {
// // TODO Auto-generated method stub
// //点击了后退键
// if(keyCode == KeyEvent.KEYCODE_BACK)
// {
// AlertDialog.Builder builder = new AlertDialog.Builder(this);
// builder.setTitle("温馨提示")//对话框标题
// .setMessage("确定要退出么?")//对话框内容
// .setIcon(R.drawable.ic_launcher)//对话框图标
// .setCancelable(false) //点击对话框之外的部分是否取消对话框
// .setPositiveButton("确定", new OnClickListener() {
//
// @Override
// public void onClick(DialogInterface dialog, int which) {
// // TODO Auto-generated method stub
// finish();//结束当前Activity
// }
// })
// .setNegativeButton("取消", new OnClickListener() {
//
// @Override
// public void onClick(DialogInterface dialog, int which) {
// // TODO Auto-generated method stub
// dialog.dismiss();//取消对话框
// }
// });
//
// Dialog dialog = builder.create();
// dialog.show();
// }
//
// return super.onKeyDown(keyCode, event);
// } }

应用程序退出提示

三、连续按两次后退键退出,一般两次按键时间间隔为2秒(handler方法)

设置一个标记变量isExit = false;

当点击后退按钮的 时候

(1)如果isExit为true 退出程序

(2)如果isExit为false 则提示“两秒内再次后退退出程序”,并是isExit为true,同时发送一个两秒延迟消息,两秒后isExit为false,这样当消息未发送出去前的两秒,再次后退 便可退出程序

 @Override
public boolean onKeyDown(int keyCode, KeyEvent event) { switch (keyCode){ case KeyEvent.KEYCODE_BACK: if(isExit){ return super.onKeyDown(keyCode, event);
}else { Toast.makeText(this, "再按一下退出程序", Toast.LENGTH_SHORT).show();
isExit = true; new Thread(new Runnable() { @Override
public void run() { try { Thread.sleep(); isExit = false; } catch (InterruptedException e) {
e.printStackTrace();
} } }).start();
return false;
} default:
return super.onKeyDown(keyCode, event); }
}

Android项目实战(二):安卓应用程序退出的三种方法的更多相关文章

  1. 【Android】Eclipse自己主动编译NDK/JNI的三种方法

    [Android]Eclipse自己主动编译NDK/JNI的三种方法 SkySeraph Sep. 18th  2014 Email:skyseraph00@163.com 一.Eclipse关联cy ...

  2. Qt下存储读写应用程序设置的三种方法

    一.简介 用户对应用程序经常有这样的要求:要求它能记住它的settings,比如窗口大小.位置和密码等等.有三种方法可以实现: 使用注册表: 使用配置文件(.ini): 使用自定义文件(例如.txt) ...

  3. Android程序完全退出的三种方法

    很多网友可能发现自己的Android程序有很多Activity,比如说主窗口A,调用了子窗口B,在B中如何关闭整个Android应用程序呢? 这里Android123给大家三种比较简单的方法实现. 首 ...

  4. Android实现 再按一次退出 的三种方法 durationTime、timerTask 和Handler

    目前很多Android应用都会实现按返回键时提示“再按一次推退出” 在这篇文章中总结了各家的方法,一般都是监听Activity的onKeyDown 或者onBackPressed方法 方法一: 直接计 ...

  5. android系统通过图片绝对路径获取URI的三种方法

    最近做项目要通过图片的绝对路径找到图片的URI,然后删除图片,小小总结一下获取URI的方法,亲自试验在 android 4.1.3的系统上都是可用的. 1.将所有的图片路径取出,遍历比较找到需要的路径 ...

  6. Android项目实战_手机安全卫士程序锁

    ###1.两个页面切换的实现1. 可以使用Fragment,调用FragmentTransaction的hide和show方法2. 可以使用两个布局,设置visibility的VISIABLE和INV ...

  7. Android程序全然退出的三种方法

    1. Dalvik VM的本地方法 android.os.Process.killProcess(android.os.Process.myPid())    //获取PID,眼下获取自己的也仅仅有该 ...

  8. Android基础知识02—安卓日志工具LogCat的五种方法

    --------Android 02-------- >>> Android的日志工具LogCat    五个方法,记录信息的级别不一样,从低到高为:    1.Log.v()-日志 ...

  9. C#计算一段程序运行时间的三种方法

    第一种方法利用System.DateTime.Now: static void SubTest() { DateTime beforDT = System.DateTime.Now; //耗时巨大的代 ...

随机推荐

  1. seajs中spm压缩工具使用

    seajs是个好东西,用起来很方便,但是她的压缩工具spm确不被网友看好,因为使用起来很麻烦,捯饬了一天多,终于勉强能压缩了,这里就简单记录一下. 按照地址:http://www.zhangxinxu ...

  2. struts2 hello world

    注意:仅需要如下这些jar包,否则启动时会出错 commons-lang3-3.2.jar commons-logging-1.1.3.jarcommons-logging-api-1.1.jarfr ...

  3. css3 画圆记录

    <style> .radar-wrapper * { -moz-box-sizing: border-box; box-sizing: border-box; margin:; paddi ...

  4. Enjoy Android

    大趋势所迫,开始学习Android, @mark一下

  5. django 快速实现完整登录系统(cookie)

    经过前面几节的练习,我们已经熟悉了django 的套路,这里来实现一个比较完整的登陆系统,其中包括注册.登陆.以及cookie的使用. 本操作的环境: =================== deep ...

  6. Mysql学习笔记(十三)权限管理

    学习内容: 1.权限管理: 关于mysql的权限简单的理解就是mysql允许你做你权利以内的事情,不可以越界.比如只允许你执行select操作,那么你就不能执行update操作.只允许你从某台机器上连 ...

  7. ompparticles.cpp:(.text+0x322): undefined reference to `omp_set_num_threads'

    参考 http://www.code-by.org/viewtopic.php?f=54&t=163

  8. spring.net中的IOC和DI-初使用

    前面准备:下载spring.net并解压 下载地址:spring.net下载地址 Ioc:控制反转         DI:依赖注入 一.IOC(控制反转) 1.新建一个控制台程序springTest, ...

  9. C# ObjectCache、OutputCache缓存

    /// <summary> /// 缓存操作类 /// </summary> public class Cache { private static List<strin ...

  10. 【C#进阶系列】10 属性

    属性分为无参属性和有参属性(即索引器). 属性相对于字段的优点不仅仅是为了封装,还可以在读写的时候做一些额外操作,缓存某些值或者推迟创建一些内部对象,也适用于以线程安全的方式访问字段. 话说最基本的属 ...