在做一个安卓小程序时,想实现”再按一次退出“的效果,主要是要覆写Activity的onKeyDown方法,判断两次按退出键的时间间隔,当大于某个值时,退出程序。
如果当前的Activity栈中只有一个Activity,则只需要调用finish方法结束这个Activity就行,比如登录页面一般是应该程序的第一个Activity,当在登录页面想实现“再按一次退出”的效果时,只需要在判断完时间后,调用finish方法,如下所示:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN){
if((System.currentTimeMillis()-exitTime) > 2000){
Toast.makeText(getApplicationContext(), "再按一次退出程序", Toast.LENGTH_SHORT).show();
exitTime = System.currentTimeMillis();
} else {
finish();
}
return true;
}
return super.onKeyDown(keyCode, event);
}
但如果Activity栈中有多个Activity,在结束掉栈顶Activity后,新的栈顶Activity会成为当前的显示页面,程序并没有实现退出的效果,上网找了很多解决办法,如在finish方法后调用System.exit(0);或者杀死进程android.os.Process.killProcess(android.os.Process.myPid());或者自己建立一个管理Activity 的列表;前两个办法试了下不起作用,第三个方法感觉太麻烦没试。
最后联想到最近在软件体系结构学的单例模式,觉得可以用得上,就试了下,成功解决了这个问题。
每次打开一个App,都只有一个App对象,所以单例指的是当前的应用程序
package com.example.lbspractice;
import android.app.Application;
public class MyApplication extends Application{
// 程序退出标记
private static boolean isProgramExit = false;
private static MyApplication instance;
public MyApplication(){
}
public static MyApplication getInstance(){
if(instance==null)
instance = new MyApplication();
return instance;
}
public void setExit(boolean exit) {
isProgramExit = exit;
}
public boolean isExit() {
return isProgramExit;
}
}
退出的时候设置MyApplication的退出属性
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN){
if((System.currentTimeMillis()-exitTime) > 2000){
Toast.makeText(getApplicationContext(), "再按一次退出程序", Toast.LENGTH_SHORT).show();
exitTime = System.currentTimeMillis();
} else {
MyApplication mApp = MyApplication.getInstance();
mApp.setExit(true);
finish();
}
return true;
}
return super.onKeyDown(keyCode, event);
}
在结束这个Activity后,覆写当前Activity栈中剩余的Activity的onStart方法
@Override
protected void onStart() {
// TODO Auto-generated method stub
super.onStart();
MyApplication mApp = MyApplication.getInstance();
if (mApp.isExit()) {
mApp.setExit(false);
finish();
}
}
要注意的是在调用最后一个Activity的finish方法之前要重新把MyApplication的isProgramExit属性设为false,不然在没有清除缓存的情况下,应用程序无法再次开启。