-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathAppManagerDelegate.java
More file actions
205 lines (190 loc) · 6.71 KB
/
Copy pathAppManagerDelegate.java
File metadata and controls
205 lines (190 loc) · 6.71 KB
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
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
package com.edaili.kotlin.baselibs.utils;
import android.app.Activity;
import java.lang.ref.WeakReference;
import java.util.Iterator;
import java.util.Stack;
/**
* Created by pangli on 2019/7/5.
* 备注:Activity管理类
*/
public final class AppManagerDelegate {
// 使用弱引用是因为存在未使用AppManager的finish方法来释放的activity,但mActivityStack并未断开对其应用导致内存泄露的问题
private Stack<WeakReference<Activity>> mActivityStack;
private static volatile AppManagerDelegate sInstance;
private AppManagerDelegate() {
}
/**
* 单例
*
* @return 返回AppManager的单例
*/
public static AppManagerDelegate getInstance() {
if (sInstance == null) {
synchronized (AppManagerDelegate.class) {
if (sInstance == null) {
sInstance = new AppManagerDelegate();
}
}
}
return sInstance;
}
/**
* 添加Activity到堆栈
*
* @param activity activity实例
*/
public void addActivity(Activity activity) {
if (mActivityStack == null) {
mActivityStack = new Stack<>();
}
mActivityStack.add(new WeakReference<>(activity));
}
/**
* 检查弱引用是否释放,若释放,则从栈中清理掉该元素
*/
public void checkWeakReference() {
if (mActivityStack != null) {
for (Iterator<WeakReference<Activity>> it = mActivityStack.iterator(); it.hasNext(); ) {
WeakReference<Activity> activityReference = it.next();
Activity temp = activityReference.get();
if (temp == null) {
it.remove();// 使用迭代器来进行安全的加锁操作
}
}
}
}
/**
* 获取当前Activity(栈中最后一个压入的)
*
* @return 当前(栈顶)activity
*/
public Activity currentActivity() {
checkWeakReference();
if (mActivityStack != null && !mActivityStack.isEmpty()) {
return mActivityStack.lastElement().get();
}
return null;
}
/**
* 结束除当前activtiy以外的所有activity
* 注意:不能使用foreach遍历并发删除,会抛出java.util.ConcurrentModificationException的异常
*
* @param activtiy 不需要结束的activity
*/
public void finishOtherActivity(Activity activtiy) {
if (mActivityStack != null && activtiy != null) {
for (Iterator<WeakReference<Activity>> it = mActivityStack.iterator(); it.hasNext(); ) {
WeakReference<Activity> activityReference = it.next();
Activity temp = activityReference.get();
if (temp == null) {// 清理掉已经释放的activity
it.remove();
continue;
}
if (temp != activtiy) {
it.remove();// 使用迭代器来进行安全的加锁操作
temp.finish();
}
}
}
}
/**
* 结束除这一类activtiy以外的所有activity
*
* @param cls 指定的某类activity
*/
public void finishOtherActivity(Class<?> cls) {
if (mActivityStack != null) {
for (Iterator<WeakReference<Activity>> it = mActivityStack.iterator(); it.hasNext(); ) {
WeakReference<Activity> activityReference = it.next();
Activity activity = activityReference.get();
if (activity == null) {// 清理掉已经释放的activity
it.remove();
continue;
}
if (!activity.getClass().equals(cls)) {
it.remove();// 使用迭代器来进行安全的加锁操作
activity.finish();
}
}
}
}
/**
* 结束当前Activity(堆栈中最后一个压入的)
*/
public void finishActivity() {
Activity activity = currentActivity();
if (activity != null) {
finishActivity(activity);
}
}
/**
* 结束指定的Activity
*
* @param activity 指定的activity实例
*/
public void finishActivity(Activity activity) {
if (activity != null) {
for (Iterator<WeakReference<Activity>> it = mActivityStack.iterator(); it.hasNext(); ) {
WeakReference<Activity> activityReference = it.next();
Activity temp = activityReference.get();
if (temp == null) {// 清理掉已经释放的activity
it.remove();
continue;
}
if (temp == activity) {
it.remove();
}
}
activity.finish();
}
}
/**
* 结束指定类名的所有Activity
*
* @param cls 指定的类的class
*/
public void finishActivity(Class<?> cls) {
if (mActivityStack != null) {
for (Iterator<WeakReference<Activity>> it = mActivityStack.iterator(); it.hasNext(); ) {
WeakReference<Activity> activityReference = it.next();
Activity activity = activityReference.get();
if (activity == null) {// 清理掉已经释放的activity
it.remove();
continue;
}
if (activity.getClass().equals(cls)) {
it.remove();
activity.finish();
}
}
}
}
/**
* 结束所有Activity
*/
public void finishAllActivity() {
if (mActivityStack != null) {
for (Iterator<WeakReference<Activity>> it = mActivityStack.iterator(); it.hasNext(); ) {
WeakReference<Activity> activityReference = it.next();
Activity activity = activityReference.get();
if (activity != null) {
activity.finish();
}
}
mActivityStack.clear();
}
}
/**
* 退出应用程序
*/
public void exitApp() {
try {
finishAllActivity();
// 退出JVM(java虚拟机),释放所占内存资源,0表示正常退出(非0的都为异常退出)
System.exit(0);
// 从操作系统中结束掉当前程序的进程
android.os.Process.killProcess(android.os.Process.myPid());
} catch (Exception e) {
}
}
}