项目中我们往往要用到关闭程序时销毁所有的activity,而且这也是面试经常遇到的问题,退出程序的方式也有好几种,一下是一些处理关闭程序的方法:

1.最简单的方式就是使用系统的方法exit(0),这是最简单粗暴的方式,强制程序退出,但是这种方法针对部分机型有可能不太好使,退出时有可能出现程序崩溃的弹出框,或者程序会重新启动,这对用户体验来说不是很好。

2.抛出异常强制退出,这种方法的使用对用户体验来说简直就是灾难,所以就不要用这种方式了。

3.使用广播的方式通知activity进行关闭,这种方式也有人在用,大家可以自行百度下,我主要介绍下面这种方式。

4.使用application,在application中创建activity集合,创建添加以及删除activity的方法,并且在BaseActivity中的生命周期中调用这些方法,在使用的时候调用BaseApplication的方法,这也是目前最常用的方法,但是这种在BaseActivity中添加activity的方法也有一个问题,那就是当你要使用第三方的BaseActivity的时候,一个还好你可以继承,那如果要使用两个第三方的BaseActivity呢,Java本身是单继承的,所以就会导致activity关闭不全了。那么这个问题的解决就要依靠一接口:ActivityLifecycleCallbacks;这是Application中声明的一个接口,其内容如下:

@Override
public void onActivityCreated(Activity activity, Bundle bundle) {
    Log.e("onActivityCreated---","is running" + "--"+activity.getLocalClassName());
}

@Override
public void onActivityStarted(Activity activity) {
    Log.e("onActivityStarted---","is running"+ "--"+activity.getClass().getCanonicalName());
}

@Override
public void onActivityResumed(Activity activity) {
    Log.e("onActivityResumed---","is running"+ "--"+activity.getClass().getCanonicalName());
}

@Override
public void onActivityPaused(Activity activity) {
    Log.e("onActivityPaused---","is running"+ "--"+activity.getClass().getCanonicalName());
}

@Override
public void onActivityStopped(Activity activity) {
    Log.e("onActivityStopped---","is running"+ "--"+activity.getClass().getCanonicalName() );
}

@Override
public void onActivitySaveInstanceState(Activity activity, Bundle bundle) {
    Log.e("onActivitySaveInstanceState---","is running"+ "--"+activity.getPackageName());
}

@Override
public void onActivityDestroyed(Activity activity) {
    Log.e("onActivityDestroyed---","is running"+ "--"+activity.getPackageName());
}

大家可以看到这些方法名采用的都是英语中的过去式命名,其意大家看方法名也应该懂了,就是activity执行过得生命周期都会在这里调用,想要这些方法执行要调用

registerActivityLifecycleCallbacks(this);

这个方法,记得一定要调用啊,还有请记住这些回调是针对所有的Activity哦,所以我们就可以使用这样的方式去对activity进行关闭或者其他操作了。下面有一种存放activity的方式,喜欢的可以使用:

private static WeakReference<Activity> curAct;
private static WeakHashMap<Activity, Object> acList = new WeakHashMap<>();

/**
 * 设置当前activity
 *
 * @param act
 */
public static void setCurActivity(Activity act) {
    curAct = new WeakReference<>(act);
    acList.put(act, null);
}

/**
 * 获取想要的activity
 * @return
 */
public static Activity getCurActivity() {
    if (acList == null || acList.isEmpty())
        return null;
    WeakReference<Activity> wr = curAct;
    if (wr != null) {
        return wr.get();
    }
    return null;
}

/**
 *清理activity
 * @param act
 */
public static void clearCurActivity(Activity act) {
    Object remove = acList.remove(act);
    if (remove != null && TextUtils
        .equals(remove.getClass().getSimpleName(), curAct.get().getClass().getSimpleName())) {
        //TODO You want to do something.
    }
}

/**
 * 销毁所有的activity
 */
public static void destroyAllActivity() {
    if (null != acList && !acList.isEmpty()) {
        Object[] keys = acList.keySet().toArray();
        for (Object obj : keys) {
            Activity act = (Activity)obj;
            if (act != null) {
                act.finish();
            }
        }
    }
}

/**
 * 关闭某个activity
 * @param activity
 */
public static void closeActivity(String  activity) {
    if (null != acList && !acList.isEmpty()) {
        Object[] keys = acList.keySet().toArray();
        for (Object obj : keys) {
            if (obj != null && activity != null && TextUtils.equals(obj.getClass().getSimpleName(),activity)) {
                Activity act = (Activity)obj;
                act.finish();
            }
        }
    }
}