记录一下我目前在用的一个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);
日常记录,谢谢