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

日常记录,谢谢

相关推荐
Mahir0814 分钟前
Spring 循环依赖深度解密:从问题本质到三级缓存源码级解析
java·后端·spring·缓存·面试·循环依赖·三级缓存
辰海Coding19 分钟前
MiniSpring框架学习笔记-解决循环依赖的简化IoC容器
笔记·学习
晓梦林37 分钟前
cp520靶场学习笔记
android·笔记·学习
RyFit1 小时前
SpringAI 常见问题及解决方案大全
java·ai
石山代码2 小时前
C++ 内存分区 堆区
java·开发语言·c++
心中有国也有家2 小时前
cann-recipes-infer:昇腾 NPU 推理的“菜谱集合”
经验分享·笔记·学习·算法
Upsy-Daisy2 小时前
AI Agent 项目学习笔记(八):Tool Calling 工具调用机制总览
人工智能·笔记·学习
绝知此事2 小时前
【算法突围 01】线性结构与哈希表:后端开发的收纳术
java·数据结构·算法·面试·jdk·散列表
无风听海2 小时前
C# 隐式转换深度解析
java·开发语言·c#
一只大袋鼠3 小时前
Git 进阶(二):分支管理、暂存栈、远程仓库与多人协作
java·开发语言·git