记录Activity启动时间 ActivityLifecycleCallbacks

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) {
   
   }
});
registerActivityLifecycleCallbacks
x
1
registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
2
   @Override
3
   public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
4
      ActivityStackManager.getInstance().push(activity);
5
   }
6
   
7
   @Override
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
   @Override
16
   public void onActivityStarted(Activity activity) {
17
   
18
   }
19
   
20
   @Override
21
   public void onActivityResumed(Activity activity) {
22
   
23
   }
24
   
25
   @Override
26
   public void onActivityPaused(Activity activity) {
27
   
28
   }
29
   
30
   @Override
31
   public void onActivityStopped(Activity activity) {
32
   
33
   }
34
   
35
   @Override
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
    @Override
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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值