一个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

更多相关文章

  1. 【Android】Android中Button的OnClickListener实现方法
  2. Android webview中定制js的alert,confirm和prompt对话框的方法 (
  3. Android 性能优化的一些方法(转)
  4. 消除“Unfortunately, System UI has stopped”的方法
  5. android 调用系统相机或者系统相册功能时,onActivityResult方法不
  6. andorid中Html.fromHtml方法

随机推荐

  1. Android使用Activity用作弹出式对话框
  2. Android(安卓)bsdiff 实现增量更新
  3. android 开机不弹出Launcher选择,直接进入
  4. 【Android okhttp源码解析 一】okhttp框
  5. Android 及 NDK开发环境搭建
  6. MVVM模式开源学习项目——玩Android客户
  7. [Android] Dalvik opcodes
  8. android ios 网页 跳转QQ群
  9. Android多媒体开发高级编程——目录
  10. 成为更好的Android开发者前,我们需要注意