Skip to content

Android 退出所有activity的几种方式

Mr.wu edited this page May 18, 2017 · 4 revisions

第一种方式

public class MyApplication extends Application {  
    private List<Activity> activityList = new ArrayList<Activity>();  
    private static MyApplication instance;  
  
    
    // 单列模式获取唯一MyApplication的实例  
    public static MyApplication getinstance() {  
        if (instance == null) {  
            instance = new MyApplication();  
        }  
        return instance;  
    }  
  
    // 添加Activity到容器中  
    public void addActivity(Activity acivity) {  
        activityList.add(acivity);  
    }  
  
    // 遍历所有的Activity并fanish  
    public void closeAllActiivty() {  
        for (int i = 0; i < activityList.size(); i++) {  
            Activity activity = activityList.get(i);  
            activity.finish();  
        }  
        System.exit(0);  
    }  
  
}  
  
在ActivityOncreate()的方法中执行:  
    MyApplication.getinstance().addActivity(FirstActivity.this);  
  
在退出所有的Activity执行:  
MyApplication.getinstance().closeAllActiivty();  

原理

先来说一下原理。我们知道,Activity有四种启动模式,分别为:standard(默认模式)、singleTop、singleTask、singleInstance。本方式需要使用的就是singleTask启动模式。

如果设置一个Activity的启动模式为singleTask,那么每次启动此Activity时系统都会检查当前任务栈中是否已经存在此Activity的实例。如果已经存在,则不再创建此Activity新的实例,而是调用已存在的Activity的onNewIntent()方法,并把intent作为此方法的参数传递给它。然后它就会被置于栈顶,并把它之前的所有的Activity移除掉。

原理实现

(我们先将进入应用的第一个Activity称为BaseActivity)。明白了基本原理之后就好办了,先将BaseActivity的启动模式设置为singleTask,并重写此Activity的onNewIntent()方法用来结束自己,之后会在此Activity上进入其他Activity进行数量不定的跳转。在需要退出时只需在当前Activity上调用startActivity(this,BaseActivity.class)会首先将除BaseActivity外的所有Activity结束掉,然后会自动调用BaseActivity的onNewIntent()结束掉自己,这样所有Activity都完美的退出了。

代码实现

第一步:设置BaseActivity的启动模式为singleTask

android:launchMode="singleTask"

第二步:重写BaseActivity的onNewIntent()方法

//声明一个静态常量,用作退出BaseActivity的Tag
public static final String EXIST = "exist";
@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    if (intent != null) {//判断其他Activity启动本Activity时传递来的intent是否为空
        //获取intent中对应Tag的布尔值
        boolean isExist = intent.getBooleanExtra(EXIST, false);
        //如果为真则退出本Activity
        if (isExist) {
            this.finish();
        }
    }
}

第三步:在需要退出应用的Activity中启动BaseActivity

Intent intent = new Intent(this,BaseActivity.class);
//传递退出所有Activity的Tag对应的布尔值为true
intent.putExtra(BaseActivity.EXIST, true);
//启动BaseActivity
startActivity(intent);

第三种方式

public class AppManager {
    private static Stack<Activity> activityStack;
    private volatile static AppManager instance;

    private AppManager() {

    }
    /**
     * 单一实例
     */
    public static AppManager getAppManager() {
        if (instance == null) {
            synchronized (AppManager.class){
                if(instance==null){
                    instance = new AppManager();
                    instance.activityStack = new Stack();
                }
            }

        }
        return instance;
    }

    /**
     * 添加Activity到堆栈
     */
    public void addActivity(Activity activity) {
        if (activityStack == null) {
            activityStack = new Stack<Activity>();
        }
        activityStack.add(activity);
    }

    /**
     * 获取当前Activity(堆栈中最后一个压入的)
     */
    public Activity currentActivity() {
        try {
            Activity activity = activityStack.lastElement();
            return activity;
        } catch (Exception e) {
//            e.printStackTrace();
            return null;
        }
    }

    /**
     * 获取当前Activity的前一个Activity
     */
    public Activity preActivity() {
        int index = activityStack.size() - 2;
        if (index < 0) {
            return null;
        }
        Activity activity = activityStack.get(index);
        return activity;
    }

    /**
     * 结束当前Activity(堆栈中最后一个压入的)
     */
    public void finishActivity() {
        Activity activity = activityStack.lastElement();
        finishActivity(activity);
    }

    /**
     * 结束指定的Activity
     */
    public void finishActivity(Activity activity) {
        if (activity != null) {
            activityStack.remove(activity);
            activity.finish();
            activity = null;
        }
    }

    /**
     * 移除指定的Activity
     */
    public void removeActivity(Activity activity) {
        if (activity != null) {
            activityStack.remove(activity);
            activity = null;
        }
    }

    /**
     * 结束指定类名的Activity
     */
    public void finishActivity(Class<?> cls) {
        try {
            for (Activity activity : activityStack) {
                if (activity.getClass().equals(cls)) {
                    finishActivity(activity);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    /**
     * 结束所有Activity
     */
    public void finishAllActivity() {
        for (int i = 0, size = activityStack.size(); i < size; i++) {
            if (null != activityStack.get(i)) {
                activityStack.get(i).finish();
            }
        }
        activityStack.clear();
    }

    /**
     * 返回到指定的activity
     *
     * @param cls
     */
    public void returnToActivity(Class<?> cls) {
        while (activityStack.size() != 0)
            if (activityStack.peek().getClass() == cls) {
                break;
            } else {
                finishActivity(activityStack.peek());
            }
    }


    /**
     * 是否已经打开指定的activity
     * @param cls
     * @return
     */
    public boolean isOpenActivity(Class<?> cls) {
        if (activityStack!=null){
            for (int i = 0, size = activityStack.size(); i < size; i++) {
                if (cls == activityStack.peek().getClass()) {
                    return true;
                }
            }
        }
        return false;
    }

    /**
     * 退出应用程序
     *
     * @param context      上下文
     * @param isBackground 是否开开启后台运行
     */
    public void AppExit(Context context, Boolean isBackground) {
        try {
            finishAllActivity();
            ActivityManager activityMgr = (ActivityManager) context
                    .getSystemService(Context.ACTIVITY_SERVICE);
            activityMgr.restartPackage(context.getPackageName());
        } catch (Exception e) {

        } finally {
            // 注意,如果您有后台程序运行,请不要支持此句子
            if (!isBackground) {
                System.exit(0);
            }
        }
    }
}

参考链接:http://www.cnblogs.com/caobotao/p/5127645.html

Home

Android 开发录

-深入理解LayoutInflater.inflate()的参数

计算机网络原理

数据库

Java 垃圾回收机制

Java 开发录

面试

搭建翻墙shadowsocks 教程

其他

Clone this wiki locally