Activity管理

前言

你是否有如下需求:

  • finish所有Activity,然后start一个新的Activity
  • 想某些Activity不被finish,其它的Activity都被销毁
  • 判断当前app是否处于前台
  • 获取当前栈顶Activity

如果有的话,那么恭喜你,找到宝了!

Kotlin版本

1
2
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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
import android.app.Activity
import android.app.Application
import android.os.Bundle
import androidx.annotation.NonNull
import androidx.collection.arrayMapOf

/**
* author : A Lonely Cat
* github : https://github.com/anjiemo
* gitee : https://gitee.com/anjiemo
* time : 2021/6/18
* desc : Activity 管理类
*/
object ActivityManager : Application.ActivityLifecycleCallbacks {

private lateinit var mApplication: Application

private val mActivityTaskMap = arrayMapOf<String, Activity>()

// 最后可见 Activity 对象的 TAG
private var mLastVisibleTag: String? = null

// 最后不可见 Activity 对象的 TAG
private var mLastInvisibleTag: String? = null

/**
* 初始化,仅第一次有效
*/
fun init(application: Application) {
if (::mApplication.isInitialized.not()) {
mApplication = application
application.registerActivityLifecycleCallbacks(this)
}
}

/**
* 获取 Application 对象
*/
fun getApplication() = mApplication

/**
* 最后一个可见的Activity和最后一个不可见的Activity不是同一个(换言之:是同一个 Activity,app则未处于前台),或栈顶 Activity不为null,则app处于前台
*
*/
fun appIsForeground() =
((mLastVisibleTag == mLastInvisibleTag).not() || getStackTopActivity() != null)

/**
* 获取在栈顶的 Activity
*/
fun getStackTopActivity() = mActivityTaskMap[mLastVisibleTag]

/**
* 销毁所有 Activity
*/
fun finishAllActivities() {
finishAllActivities(null)
}

/**
* 销毁除了参数列表中以外的所有 Activity
*/
fun finishAllActivities(vararg clazzArray: Class<out Activity>?) {
val keys: Array<String> = mActivityTaskMap.keys.toTypedArray()
for (key in keys) {
val activity: Activity? = mActivityTaskMap[key]
activity ?: continue
if (activity.isFinishing.not()) {
var isWhitelistActivity = false
for (clazz in clazzArray) {
if (activity.javaClass == clazz) {
isWhitelistActivity = true
}
}
// 如果不是白名单上面的 Activity 就销毁掉
if (!isWhitelistActivity) {
activity.finish()
mActivityTaskMap.remove(key)
}
}
}
}

override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {
setLastVisibleTag(activity)
mActivityTaskMap[mLastVisibleTag] = activity
}

override fun onActivityStarted(activity: Activity) {
setLastVisibleTag(activity)
}

override fun onActivityResumed(activity: Activity) {
setLastVisibleTag(activity)
}

override fun onActivityPaused(activity: Activity) {
setLastInvisibleTag(activity)
}

override fun onActivityStopped(activity: Activity) {
setLastInvisibleTag(activity)
}

override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {}

override fun onActivityDestroyed(activity: Activity) {
val objectTag = getObjectTag(activity)
mActivityTaskMap.remove(objectTag)
if (objectTag == mLastVisibleTag) {
// 清除当前标记
mLastVisibleTag = null
}
}

private fun setLastInvisibleTag(activity: Activity) {
mLastInvisibleTag = getObjectTag(activity)
}

private fun setLastVisibleTag(activity: Activity) {
mLastVisibleTag = getObjectTag(activity)
}

/**
* 对象所在的包名 + 对象的内存地址
*/
private fun getObjectTag(@NonNull any: Any): String =
any::class.java.name + Integer.toHexString(any.hashCode())
}

Java版本

1
2
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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
/**
* author : Android 轮子哥
* github : https://github.com/getActivity/AndroidProject
* time : 2018/11/18
* desc : Activity 管理类
*/
public final class ActivityManager implements Application.ActivityLifecycleCallbacks {

private static volatile ActivityManager sInstance;

private final ArrayMap<String, Activity> mActivitySet = new ArrayMap<>();

/** 当前应用上下文对象 */
private Application mApplication;
/** 最后一个可见的 Activity 对象标记 */
private String mLastVisibleTag;
/** 最后一个不可见的 Activity 对象标记 */
private String mLastInvisibleTag;


private ActivityManager() {}

public static ActivityManager getInstance() {
// 加入双重校验锁
if(sInstance == null) {
synchronized (ActivityManager.class) {
if(sInstance == null){
sInstance = new ActivityManager();
}
}
}
return sInstance;
}

public void init(Application application) {
mApplication = application;
application.registerActivityLifecycleCallbacks(this);
}

/**
* 获取 Application 对象
*/
public Application getApplication() {
return mApplication;
}

/**
* 获取栈顶的 Activity
*/
public Activity getTopActivity() {
return mActivitySet.get(mLastVisibleTag);
}

/**
* 判断当前应用是否处于前台状态
*
* @return appIsForeground
*/
public Boolean appIsForeground() {
// 最后一个可见的Activity和最后一个不可见的Activity是同一个,则app未处于前台
if (mLastVisibleTag.equals(mLastInvisibleTag)) {
return false;
}
return getTopActivity() != null;
}

/**
* 销毁所有的 Activity
*/
public void finishAllActivities() {
finishAllActivities((Class<? extends Activity>) null);
}

/**
* 销毁所有的 Activity,除这些 Class 之外的 Activity
*/
@SafeVarargs
public final void finishAllActivities(Class<? extends Activity>... classArray) {
String[] keys = mActivitySet.keySet().toArray(new String[]{});
for (String key : keys) {
Activity activity = mActivitySet.get(key);
if (activity != null && !activity.isFinishing()) {
boolean whiteClazz = false;
if (classArray != null) {
for (Class<? extends Activity> clazz : classArray) {
if (activity.getClass() == clazz) {
whiteClazz = true;
}
}
}
// 如果不是白名单上面的 Activity 就销毁掉
if (!whiteClazz) {
activity.finish();
mActivitySet.remove(key);
}
}
}
}

/**
* 获取一个对象的独立无二的标记
*/
private static String getObjectTag(Object object) {
// 对象所在的包名 + 对象的内存地址
return object.getClass().getName() + Integer.toHexString(object.hashCode());
}

@Override
public void onActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState) {
mLastVisibleTag = getObjectTag(activity);
mActivitySet.put(getObjectTag(activity), activity);
}

@Override
public void onActivityStarted(@NonNull Activity activity) {
mLastVisibleTag = getObjectTag(activity);
}

@Override
public void onActivityResumed(@NonNull Activity activity) {
mLastVisibleTag = getObjectTag(activity);
}

@Override
public void onActivityPaused(@NonNull Activity activity) {
mLastInvisibleTag = getObjectTag(activity);
}

@Override
public void onActivityStopped(@NonNull Activity activity) {
mLastInvisibleTag = getObjectTag(activity);
}

@Override
public void onActivitySaveInstanceState(@NonNull Activity activity, @NonNull Bundle outState) {}

@Override
public void onActivityDestroyed(@NonNull Activity activity) {
mActivitySet.remove(getObjectTag(activity));
if (getObjectTag(activity).equals(mLastVisibleTag)) {
// 清除当前标记
mLastVisibleTag = null;
}
}
}

欢迎同学们点赞、评论、打赏+关注,一键三连~


Activity管理
https://blog.funkt.cn/2021/06/18/855407462453346304/
作者
anjiemo
发布于
2021年6月18日
许可协议
未经作者授权,禁止转载