现在的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. C# 通过WebService方式 IIS发布网站 上传文件到服务器

    应用场景:要将本地的文件 上传到服务器的虚拟机上 网络环境:公司局域网(如下图中第二种) 开发环境:VS2010 服务器环境:WinServer2008    虚拟机环境:WinServer2008 ...

  2. HIVE: UDF应用实例

    数据文件内容 TEST DATA HERE Good to Go 我们准备写一个函数,把所有字符变为小写. 1.开发UDF package MyTestPackage; import org.apac ...

  3. 写的一个Sass 和Compass的例子

    /*1.打开项目根目录下的 config.rb 文件 2.搜索 line_comments 关键词,默认应该是 # line_comments = false 3.去掉前面的 #,保存 config. ...

  4. js-计时事件

    JavaScript 一个设定的时间间隔之后来执行代码,称之为计时事件. 主要通过两个方法来实现:     1.setInterval() - 间隔指定的毫秒数不停地执行指定的代码.     2.se ...

  5. CentOS6.5菜鸟之旅:安装ATI显卡驱动

    一.前言 自从安装了CentOS,我的显卡就没消停过,一直在彪高温而且噪音特别大,于是决定上网搜索解决办法.下面记录下来以供日后查阅. 二.安装fglrx driver(ATI/AMD 显卡的linu ...

  6. django book 阅读笔记

    一,django是一个十分优秀的python web的框架,那框架的是什么? 假设我们不使用框架来进行编写,我们要用如下的代码进行web脚本: #!/usr/bin/env python import ...

  7. sprint3与总结

    backlog-看板-燃尽图-每日立会 github:https://github.com/alfredzhu/team-work 总结:这种团队合作的方式很好,大家在一起沟通,相互交流想法,一起解决 ...

  8. 2014 WAP校园招聘笔试题

    2014 WAP校园招聘笔试题 Problem's Link:   http://www.doc88.com/p-6751117015483.html WAP公司笔试题 We are planning ...

  9. 面向对象的JavaScript(3):私有成员和公开成员

    在小项目中对于JavaScript使用,只要写几个function就行了.但在大型项目中,尤其是在开发追求 良好的用户体验的网站中,如SNS,就会 用到大量的JavaScrpt,有时JavaScrip ...

  10. PowerShell 从网站上下载文件

    在cmd下 执行powershell,可能会出现禁止运行的策略, 运行如下命令: powershell set-executionpolicy remotesigned 然后运行: powershel ...