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);

日常记录,谢谢

相关推荐
lee_curry1 天前
第四章 jvm中的垃圾回收器
java·jvm·垃圾收集器
酿情师1 天前
yihan:一款面向连续网页学习的智能侧边栏插件
学习·学习方法·工具·学习工具
九转成圣1 天前
Java 性能优化实战:如何将海量扁平数据高效转化为类目字典树?
java·开发语言·json
直奔標竿1 天前
Java开发者AI转型第二十七课!Spring AI 个人知识库实战(六)——全栈闭环收官,解锁前端流式渲染终极技巧
java·开发语言·前端·人工智能·后端·spring
瞎某某Blinder1 天前
DFT学习记录[6]基于 HES06的能带计算+有效质量计算
python·学习·程序人生·数据挖掘·云计算·学习方法
金銀銅鐵1 天前
[java] 编译之后的记录类(Record Classes)长什么样子(上)
java·jvm·后端
love在水一方1 天前
VLN 入门学习计划 —— 基于 InternNav
学习
野生技术架构师1 天前
金三银四面试总结篇,汇总 Java 面试突击班后的面试小册
java·面试·职场和发展
小袁拒绝摆烂1 天前
多表关联大平层转JSON树形结构
java·json