一个Android 的应用通常有多个Activity构成,但是过多的Activity仅仅用系统自带的几个Flag来处理就太局限了,因此,就自己准备写一个Activity的管理类,于是上网找了下,找到一篇转载比较广的一篇。代码如下:
package com.chinaonenet.yizhengtong.main;
import android.app.Activity;
import android.content.Context;
import java.util.Stack;
public class AppManager {
private static Stack<Activity> activityStack;
private static AppManager instance;
private AppManager(){
}
/**
* 单例模式
*/
public static AppManager getAppManager(){
if(instance==null){
instance = new AppManager();
}
return instance;
}
/**
* 添加Activity到堆栈
*/
public void addActivityStack(Activity activity){
if(activityStack==null){
activityStack=new Stack<Activity>();
}
activityStack.add(activity);
}
/**
* 获取当前activity(堆栈中最后压入的)
*/
public Activity currentActivity(){
Activity activity=activityStack.lastElement();
return activity;
}
/**
* 结束当前activity(堆栈中最后压入的)
*/
public void finishActivity(){
Activity activity=activityStack.lastElement();
finishActivity(activity);
}
/**
* 结束指定activity
*/
public void finishActivity(Activity activity) {
// TODO Auto-generated method stub
if(activity!=null && !activity.isFinishing()){
activityStack.remove(activity);
activity.finish();
activity=null;
}
}
/**
* 结束指定类名activity
*/
public void finishActivity(Class<?> cla){
for(Activity activity:activityStack){
if(activity.getClass().equals(cla)){
activity.finish();
activity=null;
break;
}
}
}
/**
* 结束所有activity
*/
public void finishAllActivity(){
for(int i=0;i<activityStack.size();i++){
if(null != activityStack.get(i)){
finishActivity(activityStack.get(i));
break;
}
}
activityStack.clear();
}
/**
* 获取指定的activity
*/
public Activity getActivity(Class<?> cla){
if(activityStack!=null){
for(Activity activity:activityStack){
if(activity.getClass().equals(cla)){
return activity;
}
}
}
return null;
}
/**
* 退出应用程序
*/
public void AppExit(Context context){
try{
finishAllActivity();
android.os.Process.killProcess(android.os.Process.myPid());
System.exit(0);
}catch (Exception e){
}
}
}
但是引入到工程当中之后完全不是那么回事!这段代码还是oschina客户端里面的一部分,其实在外部调用AppExit是没办法退出的,也就是说不能退出!!不能退出!!!不能退出!!! 重要的事说3遍!
不知道源代码的作者有没有做过测试,我自己起了一个工程,新建了3个Activity来测试,发现调用AppExit的时候根本不会回调onDestroy方法。如果通过finish方法结束了一个Activity的话,那么根据Activity的生命周期,一定会自动调用Activity的销毁方法onDestory(),但是用了android.os.Process.killProcess(android.os.Process.myPid())这个方法,Activity中的onDestory()不会执行。因为android.os.Process.killProcess(android.os.Process.myPid())属于强制关闭,完全绕过了Activity的生命周期。当然这种方法需要加上权限:
android.permission.KILL_BACKGROUND_PROCESSES
想起了一句词:竟无语凝噎!!
不过奇怪的是,既然Activity被强制退出了,为何Stack里面还能有Activity? 更奇怪的是我在C里面调用了AppExit,却只kill掉了A,有没有高手给指点下?会不会跟Stack有关系?
后面找到了另外一种用AndroidManager来退出应用的办法:
/**
* 退出应用程序
*/
public void AppExit(Context context){
try{
finishAllActivity();
ActivityManager activityMgr = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
activityMgr.restartPackage(context.getPackageName());
}catch (Exception e){
}
}
直接用ActivityManager来退出,这个基本没问题了,但是该方法运行在Android 1.5 API Level为3以上才可以,同时需要权限android.permission.RESTART_PACKAGES,也要看情况综合使用。
然后用我自己的笨办法:
public class AppManager {
private static List<Activity> activityStack;
private static AppManager instance;
private AppManager(){
}
/**
* 单例模式
*/
public static AppManager getAppManager(){
if(instance==null){
instance = new AppManager();
}
return instance;
}
/**
* 添加Activity到堆栈
*/
public void addActivityStack(Activity activity){
if(activityStack==null){
activityStack= new ArrayList<Activity>();
}
activityStack.add(activity);
}
/**
* 结束所有activity
*/
public void finishAllActivity(){
for(int i=0;i<activityStack.size();i++){
if(null != activityStack.get(i) && !activityStack.get(i).isFinishing()){
activityStack.get(i).finish();
}
}
activityStack.clear();
}
/**
* 退出应用程序
*/
public void AppExit(Context context){
try{
finishAllActivity();
}catch (Exception e){
}
}
}
直接用List来管理,我不知道会不会有什么漏洞,但是如果仅仅是用来退出应用应该是没啥的问题的
附上测试工程:http://download.csdn.net/detail/hj563308597/9404002