悲剧就是把有价值的东西毁灭给人看。——鲁迅
其实原理就是一个list,使用AOP在创建时添加,销毁时移除
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
 100
 101
 102
 103
 104
 105
 106
 107
 108
 109
 110
 111
 112
 
 | 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;
 
 
 
 
 
 
 
 
 
 
 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
这里就直接使用
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 
 | 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;
 
 
 
 
 
 
 
 
 
 
 @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();
 }
 }
 
 |