Android 之退出应用

一个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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值