安卓activity管理器

简介: 安卓activity管理器

悲剧就是把有价值的东西毁灭给人看。——鲁迅

其实原理就是一个list,使用AOP在创建时添加,销毁时移除

package com.ruben.utils;
import android.app.Activity;
import android.os.Build;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.stream.Collectors;
/**
 * @ClassName: MyActivityManager
 * @Description: 我还没有写描述
 * @Date: 2020/10/18 0018 10:16
 * *
 * @author: <achao1441470436@gmail.com>
 * @version: 1.0
 * @since: JDK 1.8
 */
public class MyActivityManager {
    public static final List<Activity> activityList = Collections.synchronizedList(new LinkedList<>());
    public static void addActivity(Activity activity) {
        activityList.add(activity);
    }
    public static void removeActivity(Activity activity) {
        activityList.remove(activity);
    }
    public static Activity getActivity() {
        if (isActivityEmpty()) {
            return null;
        }
        return activityList.get(activityList.size() - 1);
    }
    public static void killActivity() {
        killActivity(getActivity());
    }
    public static void killActivity(Activity activity) {
        if (activity == null) {
            return;
        }
        if (isActivityEmpty()) {
            return;
        }
        activity.finish();
        removeActivity(activity);
    }
    public static void killActivity(Class<?> cls) {
        Activity activity = getActivity(cls);
        if (activity == null) {
            return;
        }
        killActivity(activity);
    }
    public static Activity getActivity(Class<?> cls) {
        if (isActivityEmpty()) {
            return null;
        }
        if (cls == null) {
            return null;
        }
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
            return null;
        }
        List<Activity> activities = activityList.stream().filter(activity -> activity.getClass().equals(cls)).collect(Collectors.toList());
        if (activities.isEmpty()) {
            return null;
        }
        return activities.get(0);
    }
    public static Activity getTopActivity() {
        Activity activity = null;
        synchronized (activityList) {
            final int index = activityList.size() - 1;
            if (index < 0) {
                return null;
            }
            activity = activityList.get(index);
        }
        return activity;
    }
    public static String getTopActivityName() {
        Activity topActivity = getTopActivity();
        if (topActivity == null) {
            return null;
        }
        return topActivity.getClass().getName();
    }
    public static void killAllActivity() {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
            return;
        }
        activityList.forEach(Activity::finish);
        activityList.clear();
    }
    private static boolean isActivityEmpty() {
        return activityList.isEmpty();
    }
}

然后上篇博客配了Aspectj

这里就直接使用

package com.ruben.aop;
import android.app.Activity;
import android.app.Application;
import android.util.Log;
import com.ruben.manager.MyActivityLifecycleCallbacks;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import lombok.SneakyThrows;
/**
 * @ClassName: MyActivityManagerAop
 * @Description: 我还没有写描述
 * @Date: 2020/10/18 0018 11:40
 * *
 * @author: <achao1441470436@gmail.com>
 * @version: 1.0
 * @since: JDK 1.8
 */
@Aspect
public class MyActivityManagerAop {
    @Pointcut("execution(* com.ruben..*.onCreate(..))")
    public void onCreatePointcut() {
    }
    @SneakyThrows
    @Around("onCreatePointcut()")
    public Object addActivity(final ProceedingJoinPoint joinPoint) {
        Object object = joinPoint.getTarget();
        if (!(object instanceof Activity)) {
            return joinPoint.proceed();
        }
        Activity activity = (Activity) object;
        Application application = activity.getApplication();
        MyActivityLifecycleCallbacks myActivityLifecycleCallbacks = new MyActivityLifecycleCallbacks();
        application.registerActivityLifecycleCallbacks(myActivityLifecycleCallbacks);
        Log.i(activity.getClass().getName(), "aop execute correct");
        return joinPoint.proceed();
    }
}
相关文章
|
2月前
|
Android开发
Android面试之Activity启动流程简述
Android面试之Activity启动流程简述
84 6
|
2月前
|
消息中间件 Android开发 索引
Android面试高频知识点(4) 详解Activity的启动流程
Android面试高频知识点(4) 详解Activity的启动流程
28 3
|
2月前
|
缓存 前端开发 Android开发
Android实战之如何截取Activity或者Fragment的内容?
本文首发于公众号“AntDream”,介绍了如何在Android中截取Activity或Fragment的屏幕内容并保存为图片。包括截取整个Activity、特定控件或区域的方法,以及处理包含RecyclerView的复杂情况。
20 3
|
5月前
|
Android开发
Android面试题之Activity的启动模式和flag
Android Activity的四种启动模式:standard(默认,每次启动创建新实例),singleTop(栈顶复用,不走onCreate,调用onNewIntent),singleTask(栈内唯一,清除上方Activity)和singleInstance(单独栈内唯一)。启动模式在AndroidManifest.xml中配置,Intent Flags如FLAG_ACTIVITY_CLEAR_TOP和FLAG_ACTIVITY_SINGLE_TOP可实现类似功能。了解这些对于处理Activity栈管理至关重要。
52 0
|
2月前
|
Android开发
Android面试之Activity启动流程简述
Android面试之Activity启动流程简述
18 0
|
7月前
|
XML Java Android开发
利用Bundle实现Android Activity间消息的传递
利用Bundle实现Android Activity间消息的传递
54 2
|
3月前
|
消息中间件 Android开发 索引
Android面试高频知识点(4) 详解Activity的启动流程
讲解Activity的启动流程了,Activity的启动流程相对复杂一下,涉及到了Activity中的生命周期方法,涉及到了Android体系的CS模式,涉及到了Android中进程通讯Binder机制等等, 首先介绍一下Activity,这里引用一下Android guide中对Activity的介绍:
50 4
|
4月前
|
XML Android开发 数据格式
android中两个Activity同时设定了intent-filter的category为android.intent.category.LAUNCHER,会发生什么情况?
本文通过案例分析了在Android中当两个Activity都设置了`android.intent.category.LAUNCHER`类别时,会导致它们同时在应用启动器的"所有应用"页面显示为不同的启动入口。
87 2
android中两个Activity同时设定了intent-filter的category为android.intent.category.LAUNCHER,会发生什么情况?
|
3月前
|
Android开发 开发者
Android面试之Activity启动流程简述
每个Android开发者都熟悉的Activity,但你是否了解它的启动流程呢?本文将带你深入了解。启动流程涉及四个关键角色:Launcher进程、SystemServer的AMS、应用程序的ActivityThread及Zygote进程。核心在于AMS与ActivityThread间的通信。文章详细解析了从Launcher启动Activity的过程,包括通过AIDL获取AMS、Zygote进程启动以及ActivityThread与AMS的通信机制。接着介绍了如何创建Application及Activity的具体步骤。整体流程清晰明了,帮助你更深入理解Activity的工作原理。
53 0
|
4月前
|
开发工具 Android开发
解决Manifest merger failed : android:exported needs to be explicitly specified for <activity>
解决Manifest merger failed : android:exported needs to be explicitly specified for <activity>
88 1