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

日常记录,谢谢

相关推荐
我的xiaodoujiao2 小时前
API 接口自动化测试详细图文教程学习系列32--Allure测试报告2
python·学习·测试工具·pytest
维天说3 小时前
CLI-Switch 2026年3月版历史设计:Hook、TTY 隔离与 JSON 状态
java·服务器·json
执明wa4 小时前
LayoutInflater详解: XML是如何变成View的?
android·xml·开发语言·android studio
404_coder4 小时前
源码视角下的 Android 开机流程:从 Zygote、SystemServer 到 Launcher
android
Zane19944 小时前
并发 vs 并行:别再傻傻分不清了,一文讲透 Java 并发编程的第一课
java·后端
你想知道什么?4 小时前
线性回归-学习笔记
笔记·学习·线性回归
鱼毓屿御4 小时前
从「只会聊」到「边想边做」的跃迁
前端·学习·react.js
二流小码农4 小时前
鸿蒙开发:以登录案例了解代码架构MVVM
android·ios·harmonyos
噢,我明白了5 小时前
java中Excel的导入和导出(EasyExcel)
java·开发语言·excel
吠品5 小时前
Zabbix Web界面误报Server未运行的排查与解决
java·服务器·数据库