在程序的主界面通常都有这样的需求,按一次返回键提示退出,按两次退出程序功能,
如果你的界面里activity个数少时可以直接使用
System.exit(0);
退出程序,但是,当你的activity很多而且有很频繁的交互时就得将你的activity全部finish掉,不然你的程序退出了又会弹出其他activity界面
public class AppManager {
private static AppManager instance;
private static Stack<Activity> activityStack;
private AppManager(){}
/*
懒汉式单例模式
*/
public static AppManager getAppManagerInstance(){
if(instance==null){
synchronized (Object.class){
if(instance==null){
instance=new AppManager();
}
}
}
return instance;
}
/*
添加activity到堆栈里
*/
public void addActivity(Activity activity){
if(activityStack==null){
activityStack=new Stack<>();
}
activityStack.add(activity);
}
/*
获取当前Activity(也就是堆栈里的最后一个进入的-----top)
*/
public Activity getCurrentActivity(){
return activityStack.lastElement();
}
/*
结束当前的Activity(堆栈里的Top元素)
*/
public void finishActivity(){
Activity activity = activityStack.lastElement();
finishActivity(activity);
}
/*
结束指定的Activity
*/
private void finishActivity(Activity activity) {
if(activity!=null&&!activity.isFinishing()){
activityStack.remove(activity);
activity.finish();
activity=null;
}
}
/*
结束指定类名的Activity
*/
public void finishActivity(Class<?> c){
for(Activity activity:activityStack){
if(activity.getClass().equals(c)) {
finishActivity(activity);
}
break;
}
}
/*
结束所有的Activity
*/
public void finishAllActivity(){
for (int i=0;i< activityStack.size();i++){
if(null!=activityStack.get(i)){
//finishActivity方法中的activity.isFinishing()方法会导致某些activity无法销毁
//貌似跳转的时候最后一个activity 是finishing状态,所以没有执行
//内部实现不是很清楚,但是实测结果如此,使用下面代码则没有问题
// find by TopJohn
//finishActivity(activityStack.get(i));
activityStack.get(i).finish();
}
}
activityStack.clear();
}
/*
获取指定的activity
*/
public Activity getAcivity(Class<?> c){
if(activityStack!=null){
for(Activity activity:activityStack){
if(activity.getClass().equals(c)){
return activity;
}
}
}
return null;
}
/*
退出应用程序
*/
public void AppExit(Context context){
try {
finishAllActivity();
//杀死该应用程序
android.os.Process.killProcess(Process.myPid());
System.exit(0);
}catch (Exception e){
e.getMessage();
}
}
}
我们首先得将我们的activity添加我们的堆栈里面,在我们的activity的基类(BaseActivity)里进行添加
public class BaseActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
AppManager.getAppManagerInstance().addActivity(this);
}
}
然后让我们的其他Activity继承我们的基类
public class HomeActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
requestWindowFeature(Window.FEATURE_NO_TITLE);
super.onCreate(savedInstanceState);
setContentView(R.layout.homeactivity_main);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_BACK:
Timer timer = new Timer();
if (!flag) {
showToast("再按一次返回键退出程序");
flag = true;
timer.schedule(new TimerTask() {
@Override
public void run() {
flag = false;
}
}, 2000);
} else {
flag = false;
AppManager.getAppManagerInstance().finishAllActivity();
}
break;
case KeyEvent.KEYCODE_HOME:
AppManager.getAppManagerInstance().finishAllActivity();
break;
}
return true;
}
}
这样就能安全的退出而不会出现退出程序还会弹出界面的问题