| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- package com.zy.bvvm.helper;
- import android.app.Activity;
- import androidx.collection.ArrayMap;
- public final class ActivityStackManager {
- private static volatile ActivityStackManager sInstance;
- private ArrayMap<String, Activity> mActivitySet = new ArrayMap<>();
- // 当前 Activity 对象标记
- private String mCurrentTag;
- private ActivityStackManager() {}
- public static ActivityStackManager getInstance() {
- // 加入双重校验锁
- if(sInstance == null) {
- synchronized (ActivityStackManager.class) {
- if(sInstance == null){
- sInstance = new ActivityStackManager();
- }
- }
- }
- return sInstance;
- }
- /**
- * 获取栈顶的 Activity
- */
- public Activity getTopActivity() {
- return mActivitySet.get(mCurrentTag);
- }
- /**
- * 销毁所有的 Activity
- */
- public void finishAllActivities() {
- finishAllActivities((Class<? extends Activity>) null);
- }
- /**
- * 销毁所有的 Activity,除这些 Class 之外的 Activity
- */
- @SafeVarargs
- public final void finishAllActivities(Class<? extends Activity>... classArray) {
- String[] keys = mActivitySet.keySet().toArray(new String[]{});
- for (String key : keys) {
- Activity activity = mActivitySet.get(key);
- if (activity != null && !activity.isFinishing()) {
- boolean whiteClazz = false;
- if (classArray != null) {
- for (Class<? extends Activity> clazz : classArray) {
- if (activity.getClass() == clazz) {
- whiteClazz = true;
- }
- }
- }
- // 如果不是白名单上面的 Activity 就销毁掉
- if (!whiteClazz) {
- activity.finish();
- mActivitySet.remove(key);
- }
- }
- }
- }
- public void onActivityCreated(Activity activity) {
- mCurrentTag = getObjectTag(activity);
- mActivitySet.put(getObjectTag(activity), activity);
- }
- public void onActivityDestroyed(Activity activity) {
- mActivitySet.remove(getObjectTag(activity));
- // 如果当前的 Activity 是最后一个的话
- if (getObjectTag(activity).equals(mCurrentTag)) {
- // 清除当前标记
- mCurrentTag = null;
- }
- }
- /**
- * 获取一个对象的独立无二的标记
- */
- private static String getObjectTag(Object object) {
- // 对象所在的包名 + 对象的内存地址
- return object.getClass().getName() + Integer.toHexString(object.hashCode());
- }
- }
|