Android项目实战(二):安卓应用程序退出的三种方法

时间:2024-03-21 17:33:50

现在的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); }
}