ActivityStackManager
定义一个集合(Stack)保存所有还未销毁的 Activity
public class ActivityStackManager {
private Stack<ActivityInfo> activityStack;
private static ActivityStackManager instance = new ActivityStackManager();
private ActivityStackManager() {//构造方法私有
}
public static ActivityStackManager getInstance() {
return instance;
}
//入栈
public void push(Activity activity) {
if (activityStack == null) activityStack = new Stack<>();
for (int i = 0; i < activityStack.size(); i++) {
if (activity == activityStack.get(i).activity) return;
}
activityStack.add(ActivityInfo.newBuilder()
.activity(activity)
.startTime(System.currentTimeMillis())
.build());
}
//出栈
public void pop(Activity activity) {
if (activityStack != null && activityStack.size() > 0 && activity != null) {
activity.finish();
activityStack.remove(new ActivityInfo(activity));
}
}
//第一种方式
public ActivityInfo getActivityInfo(Activity activity) {
ActivityInfo activityInfo = null;
if (activityStack != null && activityStack.size() > 0) {
for (ActivityInfo info : activityStack) {
if (info.activity == activity) {
activityInfo = info;
break;
}
}
}
return activityInfo;
}
//第二种方式,不建议采用这种方式,因为在使用中发现可能会报数组越界异常
//原因可能是当我通过search查找到之后和通过get获取之前这段时间,某个Activity被移除掉了,所以导致数组大小改变,取值时就可能越界了
public ActivityInfo getActivityInfo2(Activity activity) {
ActivityInfo activityInfo = null;
if (activityStack != null && activityStack.size() > 0) {
int index = activityStack.search(new ActivityInfo(activity));
if (index >= 0) {
activityInfo = activityStack.get(index);
}
}
return activityInfo;
}
public long getStartTime(Activity activity) {
ActivityInfo activityInfo = getActivityInfo(activity);
return activityInfo != null ? activityInfo.startTime : 0;
}
}
x
1
public class ActivityStackManager {
2
private Stack<ActivityInfo> activityStack;
3
4
private static ActivityStackManager instance = new ActivityStackManager();
5
6
private ActivityStackManager() {//构造方法私有
7
}
8
9
public static ActivityStackManager getInstance() {
10
return instance;
11
}
12
13
//入栈
14
public void push(Activity activity) {
15
if (activityStack == null) activityStack = new Stack<>();
16
17
for (int i = 0; i < activityStack.size(); i++) {
18
if (activity == activityStack.get(i).activity) return;
19
}
20
activityStack.add(ActivityInfo.newBuilder()
21
.activity(activity)
22
.startTime(System.currentTimeMillis())
23
.build());
24
}
25
26
//出栈
27
public void pop(Activity activity) {
28
if (activityStack != null && activityStack.size() > 0 && activity != null) {
29
activity.finish();
30
activityStack.remove(new ActivityInfo(activity));
31
}
32
}
33
34
//第一种方式
35
public ActivityInfo getActivityInfo(Activity activity) {
36
ActivityInfo activityInfo = null;
37
if (activityStack != null && activityStack.size() > 0) {
38
for (ActivityInfo info : activityStack) {
39
if (info.activity == activity) {
40
activityInfo = info;
41
break;
42
}
43
}
44
}
45
return activityInfo;
46
}
47
48
//第二种方式,不建议采用这种方式,因为在使用中发现可能会报数组越界异常
49
//原因可能是当我通过search查找到之后和通过get获取之前这段时间,某个Activity被移除掉了,所以导致数组大小改变,取值时就可能越界了
50
public ActivityInfo getActivityInfo2(Activity activity) {
51
ActivityInfo activityInfo = null;
52
if (activityStack != null && activityStack.size() > 0) {
53
int index = activityStack.search(new ActivityInfo(activity));
54
if (index >= 0) {
55
activityInfo = activityStack.get(index);
56
}
57
}
58
return activityInfo;
59
}
60
61
public long getStartTime(Activity activity) {
62
ActivityInfo activityInfo = getActivityInfo(activity);
63
return activityInfo != null ? activityInfo.startTime : 0;
64
}
65
}
registerActivityLifecycleCallbacks
注册 Activity 生命周期回调
registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
ActivityStackManager.getInstance().push(activity);
}
@Override
public void onActivityDestroyed(Activity activity) {
long time = ActivityStackManager.getInstance().getStartTime(activity);
String date = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss SSS", Locale.getDefault()).format(new Date(time));
Log.i("bqt", "【" + activity.getClass().getSimpleName() + "启动时间】" + date);
ActivityStackManager.getInstance().pop(activity);//必须放在获取消息后面,否则一经清空了就获取不到了
}
@Override
public void onActivityStarted(Activity activity) {
}
@Override
public void onActivityResumed(Activity activity) {
}
@Override
public void onActivityPaused(Activity activity) {
}
@Override
public void onActivityStopped(Activity activity) {
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
}
});
x
1
registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
2
3
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
4
ActivityStackManager.getInstance().push(activity);
5
}
6
7
8
public void onActivityDestroyed(Activity activity) {
9
long time = ActivityStackManager.getInstance().getStartTime(activity);
10
String date = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss SSS", Locale.getDefault()).format(new Date(time));
11
Log.i("bqt", "【" + activity.getClass().getSimpleName() + "启动时间】" + date);
12
ActivityStackManager.getInstance().pop(activity);//必须放在获取消息后面,否则一经清空了就获取不到了
13
}
14
15
16
public void onActivityStarted(Activity activity) {
17
18
}
19
20
21
public void onActivityResumed(Activity activity) {
22
23
}
24
25
26
public void onActivityPaused(Activity activity) {
27
28
}
29
30
31
public void onActivityStopped(Activity activity) {
32
33
}
34
35
36
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
37
38
}
39
});
ActivityInfo
保存与Activity相关的一些信息
/**
* 用于保存Activity示例以及与Activity相关的一些信息,比如Activity启动时间等
*/
public class ActivityInfo {
public Activity activity;
public long startTime;
public ActivityInfo(Activity activity) {
this.activity = activity;
}
@Override
public boolean equals(Object obj) {//必须重写equals方法
return obj instanceof ActivityInfo && ((ActivityInfo) obj).activity.equals(activity);
}
//***************************************** Builder *************************************************
private ActivityInfo(Builder builder) {
activity = builder.activity;
startTime = builder.startTime;
}
public static Builder newBuilder() {
return new Builder();
}
public static final class Builder {
private Activity activity;
private long startTime;
private Builder() {
}
public Builder activity(Activity val) {
activity = val;
return this;
}
public Builder startTime(long val) {
startTime = val;
return this;
}
public ActivityInfo build() {
return new ActivityInfo(this);
}
}
}
x
1
/**
2
* 用于保存Activity示例以及与Activity相关的一些信息,比如Activity启动时间等
3
*/
4
public class ActivityInfo {
5
public Activity activity;
6
public long startTime;
7
8
public ActivityInfo(Activity activity) {
9
this.activity = activity;
10
}
11
12
13
public boolean equals(Object obj) {//必须重写equals方法
14
return obj instanceof ActivityInfo && ((ActivityInfo) obj).activity.equals(activity);
15
}
16
17
//***************************************** Builder *************************************************
18
19
private ActivityInfo(Builder builder) {
20
activity = builder.activity;
21
startTime = builder.startTime;
22
}
23
24
public static Builder newBuilder() {
25
return new Builder();
26
}
27
28
public static final class Builder {
29
private Activity activity;
30
private long startTime;
31
32
private Builder() {
33
}
34
35
public Builder activity(Activity val) {
36
activity = val;
37
return this;
38
}
39
40
public Builder startTime(long val) {
41
startTime = val;
42
return this;
43
}
44
45
public ActivityInfo build() {
46
return new ActivityInfo(this);
47
}
48
}
49
}
2018-5-30