采用Singleton模式来处理,这种方式可以说是目前为止最好的解决办法了,它的原理主要是将所有启动的Activity放入一个全局的静态堆栈中,而在程序退出时,一次性销毁堆栈中所有存在的Activity。
对于同时启动了很多Activity的Android应用的完美退出,网上最常用的有三种解决方案,但是每种都有不足之处,如下:
第一种,Dalvik VM的本地方法。
android.os.Process.killProcess(android.os.Process.myPid());
System.exit(0);
个人理解这种方式只适合Task中始终只有一个Activity的情形,对于一个以上的情况,它就只能销毁当前的Activity了,而对于在Task中位于这个Activity之下的Activity,个人认为似乎是无能为力。
第二种,任务管理器方法。
ActivityManager activityMgr = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
activityMgr.restartPackage(getPackageName());
Android 1.5 API 3以上才可以,同时需要如下权限,而且这种方式Google官方的最新版中好像已经不支持了,因为restartPackage这个方法好像没有了。
1 <uses-permission android:name="android.permission.RESTART_PACKAGES"/>
将退出操作放置在应用的第一个Activity中,其他Activity通过使用Intent.FLAG_ACTIVITY_CLEAR_TOP种方式到达第一个Activity后,再从第一个Activity来退出。而对于将退出操作不放在应用的第一个Activity中的这种情况,这种方式就没法解决了。
第四种,采用Singleton模式来处理,这种方式可以说是目前为止最好的解决办法了,它的原理主要是将所有启动的Activity放入一个全局的静态堆栈中,而在程序退出时,一次性销毁堆栈中所有存在的Activity。下面是为了实现这种方式而写的类:
package cn.net.toms.client.common;
import java.util.Stack;
import android.app.Activity;
public class ScreenManager {
/**
* 视图管理器,用于完全退出
*
* @return
*/
public static ScreenManager getScreenManager() {
if (instance == null) {
instance = new ScreenManager();
}
return instance;
}
/**
* 回收堆栈中指定的activity
*
* @param activity
*/
public void popActivity(Activity activity) {
if (activity != null) {
activity.finish();
activityStack.remove(activity);
activity = null;
}
}
/**
* 获取堆栈的栈顶activity
*
* @return 栈顶activity
*/
private Activity currentActivity() {
Activity activity = null;
try {
if (!activityStack.isEmpty()) {
activity = activityStack.pop();
}
return activity;
} catch (Exception ex) {
System.out.println("ScreenManager:currentActivity---->"
+ ex.getMessage());
return activity;
} finally {
activity = null;
}
}
/**
* 将activity压入堆栈
*
* @param activity
* 需要压入堆栈的activity
*/
public void pushActivity(Activity activity) {
if (activityStack == null) {
activityStack = new Stack<Activity>();
}
activityStack.push(activity);
}
/**
* 回收堆栈中所有Activity
*/
public void popAllActivity() {
Activity activity = null;
try {
while (!activityStack.isEmpty()) {
activity = currentActivity();
if (activity != null) {
popActivity(activity);
}
}
} finally {
activity = null;
}
}
private ScreenManager() {
}
private static Stack<Activity> activityStack;
private static ScreenManager instance;
}
然后在每个Activity的onCreate方法中加入
ScreenManager.getScreenManager().pushActivity(this);
即可将所有Activity放入这个堆栈中。最后我们在程序退出时如下操作,即可完美的退出整个应用。
ScreenManager.getScreenManager().popAllActivity();
不考虑Activity的finish下的退出。