现在的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#截取指定长度的字符串

    /// <summary> /// 截取指定長度的字符串 /// </summary> /// <param name="s"></par ...

  2. H5+CSS3实现手指滑动切换图片

    包含3个文件:html.slider-H5.js.jquery.js(自行下载).在html中可配置滑动参数.具体代码如下: HTML代码: <!DOCTYPE HTML> <htm ...

  3. 在线头像上传(js)

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  4. 如何克隆kvm虚拟机

    关于如何使用kvm虚拟化技术创建虚拟机,这里有一系列博客讲的已经非常清楚了,这里不再赘述,不过其中有些小坑可能需要大家注意: 0. 写在创建虚拟机之前(即教程的系列三之前) 1. 确认防火墙是否关闭, ...

  5. [Solution] 一步一步WCF(1) 快速入门

    Windows Communication Foundation(WCF)是由微软开发的一系列支持数据通信的应用程序框架,可以翻译为Windows 通讯开发平台.整合了原有的windows通讯的 .n ...

  6. ASP.NEt MVC5--创建下拉列表

    Adding Search by Genre If you added the HttpPost version of the Index  method, delete it now. Next, ...

  7. 面向对象的JavaScript(2):类

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

  8. PHP框架中最喜欢的WindFramework

    题外话, 像我这样从小到大作文打0分居多的人,写文章,实在是没有耐心的,抱歉. 尽管自己也山寨过许多PHP框架,但被山寨的对象中,最喜欢的是WindFramework. Yii其实更好,但太大而全. ...

  9. SpringMvc+Mybatis 框架搭建

    本文承接上一篇[idea使用maven搭建springmvc] 开篇:在main/resources下新建dbconfig.properties.spring.xml.spring-mybatis.x ...

  10. 线段树或树状数组---Flowers

    题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=4325 Description As is known to all, the blooming tim ...