Android项目实战(二):安卓应用程序退出的三种方法
现在的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项目实战(二):安卓应用程序退出的三种方法的更多相关文章
- 【Android】Eclipse自己主动编译NDK/JNI的三种方法
[Android]Eclipse自己主动编译NDK/JNI的三种方法 SkySeraph Sep. 18th 2014 Email:skyseraph00@163.com 一.Eclipse关联cy ...
- Qt下存储读写应用程序设置的三种方法
一.简介 用户对应用程序经常有这样的要求:要求它能记住它的settings,比如窗口大小.位置和密码等等.有三种方法可以实现: 使用注册表: 使用配置文件(.ini): 使用自定义文件(例如.txt) ...
- Android程序完全退出的三种方法
很多网友可能发现自己的Android程序有很多Activity,比如说主窗口A,调用了子窗口B,在B中如何关闭整个Android应用程序呢? 这里Android123给大家三种比较简单的方法实现. 首 ...
- Android实现 再按一次退出 的三种方法 durationTime、timerTask 和Handler
目前很多Android应用都会实现按返回键时提示“再按一次推退出” 在这篇文章中总结了各家的方法,一般都是监听Activity的onKeyDown 或者onBackPressed方法 方法一: 直接计 ...
- android系统通过图片绝对路径获取URI的三种方法
最近做项目要通过图片的绝对路径找到图片的URI,然后删除图片,小小总结一下获取URI的方法,亲自试验在 android 4.1.3的系统上都是可用的. 1.将所有的图片路径取出,遍历比较找到需要的路径 ...
- Android项目实战_手机安全卫士程序锁
###1.两个页面切换的实现1. 可以使用Fragment,调用FragmentTransaction的hide和show方法2. 可以使用两个布局,设置visibility的VISIABLE和INV ...
- Android程序全然退出的三种方法
1. Dalvik VM的本地方法 android.os.Process.killProcess(android.os.Process.myPid()) //获取PID,眼下获取自己的也仅仅有该 ...
- Android基础知识02—安卓日志工具LogCat的五种方法
--------Android 02-------- >>> Android的日志工具LogCat 五个方法,记录信息的级别不一样,从低到高为: 1.Log.v()-日志 ...
- C#计算一段程序运行时间的三种方法
第一种方法利用System.DateTime.Now: static void SubTest() { DateTime beforDT = System.DateTime.Now; //耗时巨大的代 ...
随机推荐
- Java知多少(105)套接字(Socket)
网络应用模式主要有: 主机/终端模式:集中计算,集中管理: 客户机/服务器(Client/Server,简称C/S)模式:分布计算,分布管理: 浏览器/服务器模式:利用Internet跨平台. www ...
- 后端码农谈前端(CSS篇)第一课:CSS概述
一.从扮演浏览器开始 扮演浏览器是Head First图书中很有意义的一个环节.可作者忘记了告诉我们扮演浏览器的台本.我们从这里开始. 上图是webkit内核渲染html和css的流程图.从该图我们可 ...
- sql server 调用webservice
sql server版本2008以上,应该都可以 更改服务器配置 sp_configure ; GO RECONFIGURE; GO sp_configure ; GO RECONFIGURE; GO ...
- SQL Server 2012:SQL Server体系结构——一个查询的生命周期(第1部分)
为了缩小读取操作所涉及范围,本文首先着眼于简单的SELECT查询,然后引入执行更新操作有关的附加过程.最后你会读到,优化性能时SQLServer使用还原工具的相关术语和流程. 关系和存储引擎 如图所示 ...
- XPATH使用总结
最近公司里需要写一些爬虫项目,所以去接触学习了xpath的内容.在w3c上给出了xpath的语法,但是我感觉不全,而且讲得也不详细,我又去网上找了一些文章,总结一下. 这几个都是比较常用的,能解决基本 ...
- elasticsearch配置
配置文件详解1.0版 配置文件位于es根目录的config目录下面,有elasticsearch.yml和logging.yml两个配置,主配置文件是elasticsearch.yml,日志配置文件是 ...
- eclipse中 properties文件编码问题
1. Eclipse修改设置 项目中用到了配置文件,所以在Eclipse中新建.properties文件,文件中编辑了中文,在保存时Eclipse报出以下错误: 解决这个问题的方法: 依次选择: 菜单 ...
- Struts 2常用的Ajax标签
Struts 2对Ajax的支持 •Struts 2对Ajax提供了很好的支持 –Struts 2.1提供了基于Dojo的Ajax标签,对Ajax操作进行了进步封装,可以更快捷容易的使用Ajax ...
- C#开源资源项目
一.AOP框架 Encase 是C#编写开发的为.NET平台提供的AOP框架.Encase 独特的提供了把方面(aspects)部署到运行时代码,而其它AOP框架依赖配置文件的方式.这种部署方面(as ...
- Matlab绘图(一二三维)
Matlab绘图 强大的绘图功能是Matlab的特点之一,Matlab提供了一系列的绘图函数,用户不需要过多的考虑绘图的细节,只需要给出一些基本参数就能得到所需图形,这类函数称为高层绘图函数.此外,M ...