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

日常记录,谢谢

相关推荐
带刺的坐椅5 分钟前
Snack4 Json 流式解析与自动结构修复深度指南
java·llm·json·jsonpath
zb200641208 分钟前
Spring Boot 实战篇(四):实现用户登录与注册功能
java·spring boot·后端
-Springer-9 分钟前
STM32 学习 —— 个人学习笔记9-1(USART串口协议 & 串口发送及接收数据)
笔记·stm32·学习
我命由我1234512 分钟前
Android 多进程开发 - FileDescriptor、Uri、AIDL 接口定义不能抛出异常
android·java·java-ee·kotlin·android studio·android-studio·android runtime
_李小白14 分钟前
【OSG学习笔记】Day 1: OpenSceneGraph(OSG)安装指南
笔记·学习
xyhuix19 分钟前
Spring+Quartz实现定时任务的配置方法
java
分享牛22 分钟前
Operaton入门到精通22-Operaton 2.0 升级指南:Spring Boot 4 核心变更详解
java·spring boot·后端
jinanmichael23 分钟前
SpringBoot 如何调用 WebService 接口
java·spring boot·后端
深蓝轨迹24 分钟前
吃透 Spring Boot dataSource与Starter
java·spring boot·笔记·后端