Android Activity管理工具类

记录一下我目前在用的一个Activity管理工具类

java 复制代码
import android.app.Activity;
import android.app.Application;
import android.os.Bundle;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * Desc: Activity管理
 */
public class ActivityTracker {

    private static final List<WeakReference<AppCompatActivity>> mActivityList = new ArrayList<>();
    private static final ReferenceQueue<AppCompatActivity> mReferenceQueue = new ReferenceQueue<>();
    private static WeakReference<AppCompatActivity> mCurrentActivity = new WeakReference<>(null);

    private ActivityTracker() {

    }

    /**
     * 需要在Application中初始化
     */
    public static void init(@NonNull Application application) {
        application.registerActivityLifecycleCallbacks(new Application.ActivityLifecycleCallbacks() {
            @Override
            public void onActivityCreated(@NonNull Activity activity, Bundle savedInstanceState) {
                if (activity instanceof AppCompatActivity) {
                    addActivity((AppCompatActivity) activity);
                }
            }

            @Override
            public void onActivityStarted(@NonNull Activity activity) {
                
            }

            @Override
            public void onActivityResumed(@NonNull Activity activity) {
                if (activity instanceof AppCompatActivity) {
                    setCurrentActivity((AppCompatActivity) activity);
                }
            }

            @Override
            public void onActivityPaused(@NonNull Activity activity) {
                
            }

            @Override
            public void onActivityStopped(@NonNull Activity activity) {
                
            }

            @Override
            public void onActivitySaveInstanceState(@NonNull Activity activity, @NonNull Bundle outState) {
                
            }

            @Override
            public void onActivityDestroyed(@NonNull Activity activity) {
                if (activity instanceof AppCompatActivity) {
                    removeActivity((AppCompatActivity) activity);
                }
            }
        });
    }

    private static synchronized void addActivity(AppCompatActivity activity) {
        cleanUpReferences();
        mActivityList.add(new WeakReference<>(activity, mReferenceQueue));
    }

    private static synchronized void removeActivity(AppCompatActivity activity) {
        cleanUpReferences();
        Iterator<WeakReference<AppCompatActivity>> iterator = mActivityList.iterator();
        while (iterator.hasNext()) {
            WeakReference<AppCompatActivity> ref = iterator.next();
            AppCompatActivity item = ref.get();
            if (item == null || item == activity) {
                iterator.remove();
            }
        }
    }

    private static synchronized void setCurrentActivity(AppCompatActivity activity) {
        mCurrentActivity = new WeakReference<>(activity);
    }

    /**
     * 获取当前活动的Activity(可能为null)
     */
    @Nullable
    public static AppCompatActivity getCurrentActivity() {
        return mCurrentActivity.get();
    }

    /**
     * 结束所有Activity
     */
    public static void finishAll() {
        List<AppCompatActivity> activities = new ArrayList<>();
        synchronized (ActivityTracker.class) {
            cleanUpReferences();
            for (WeakReference<AppCompatActivity> ref : mActivityList) {
                AppCompatActivity activity = ref.get();
                if (activity != null) {
                    activities.add(activity);
                }
            }
            mActivityList.clear(); // 清空引用列表
        }
        for (AppCompatActivity activity : activities) {
            activity.finishAffinity(); // 关闭所有同一任务栈中的 Activity
        }
    }

    /**
     * 清理已被回收的弱引用
     */
    private static void cleanUpReferences() {
        Reference<? extends AppCompatActivity> ref;
        while ((ref = mReferenceQueue.poll()) != null) {
            synchronized (ActivityTracker.class) {
                mActivityList.remove(ref);
            }
        }
    }

    /**
     * 获取当前Activity数量(可用于调试)
     */
    public static int getActivityCount() {
        cleanUpReferences();
        synchronized (ActivityTracker.class) {
            return mActivityList.size();
        }
    }
}

用法

得先在Application中的onCreate中初始化

java 复制代码
 ActivityTracker.init(this);

日常记录,谢谢

相关推荐
ghgxm5201 小时前
Fastapi_00_学习策略与学习计划
python·学习·前端框架·npm·fastapi
AugustRed2 小时前
net.bytebuddy字节码引擎,动态生成Java类
java·开发语言
hkNaruto2 小时前
【AI】AI学习笔记:翻译:langGraph 持久化执行 以及文档部分理解
笔记·学习·microsoft
pixcarp2 小时前
Golang web工作原理详解
开发语言·后端·学习·http·golang·web
青衫码上行2 小时前
SpringBoot多环境配置
java·spring boot·后端·学习
shix .2 小时前
spiderdemo-T8字体反扒
android
爬山算法2 小时前
Hibernate(54)Hibernate中的批量更新如何实现?
java·后端·hibernate
Elieal2 小时前
零基础入门 WebSocket:从原理到 Java 实战
java·websocket·网络协议
敲敲了个代码2 小时前
前端指纹技术是如何实现的?(Canvas、Audio、硬件API 核心原理解密)
前端·javascript·学习·算法·面试·web