引言:
许多app的在线时间统计都是通过在活动的生命周期中填充点来完成的。 我这里既然封装在sdk里,当然不能这样来。 封装sdk的规则,大家都知道尽量减少参与,尽量使回调完整,尽量不拥有权限。
需求分析:
作为sdk,用APP初始化,加入是最好的。 当然,APP上下文很好。 为什么? 生命周期很长呢。 我这个sdk是观察APP在线时间的,当然不能随便回收。 然后是权限的问题。 只有低调点,才能有人用。 否则,用户会被你的很多权限吓跑。
因为无法在所有活动中嵌入侦听状态,所以只能在应用程序上下文中找到方法。 看看有没有办法可以拦截整个。 查了api,还有。 开始制造车轮了。
实践:
试着寻找方法吧:
不,这个方法很直接啊。 这是活动生命周期回调。 有了这个,就能期待有大事了!
请点击查看详细内容并确认:
我的god,I love it! 饿了送鸡腿,困了送枕头啊。
1 .分析生命周期的场景
1.activity被后台强制杀害,退出,并向时间日志报告。
2 .活动陆续退出干净后退出,并上报时间日志。
2 .代码
基于这两个场景,它立即启动,使用一个map记录activity的启动和结束,并在多个flag标签之间切换生命周期。 但是下了一封后,我发现没这么简单。 想的真多。
首先,考虑启动模式。 标准模式,A-B-A,生命周期,这应该大家都很熟悉。 但是,单任务在拦截中发生了变化。 对于A-B-A,在a的非活动活动(activity activity )方法中,活动是a的实例,而不是预期的b的实例。 当然还有很多其他问题。 不一一赘述。 代码是最好的老师。
核心代码: package com.ailin.shone worn.online statics;
导入安卓. app.activity;
导入安卓. app.application;
导入安卓. content.context;
导入安卓. OS.bundle;
import java.util.HashMap;
import java.util.Map;
//*
*创建by admin on 2018/3/2。
* @ author Chen乡乡
* shoneworn@163.com
*来源: http://www.cnblogs.com/shoneworn
*/
class OnLineStatisticsClass {
私有标记='在线状态';
私密布尔isappalive=true; //judge is app alive;
私密性booleanisswitchactivity=假; //judgeisswitchactivityfromtoptootherinthestackofactivity
私密布尔isap pexit=false; //sometimesapphavecleardthestackofactivitybutappisnotexit.thisbooleancanhelptostaticrealive;
隐私字符串顶级活动;
私有映射图=new hashmap (;
私密长时间开始=0;//开始标签时间模板
隐私在线impl impl; //set a callback
公共语音输入(finalcontextcontext ) {
应用程序应用程序=(应用程序) context.getApplicationContext (;
time start=系统. current time millis ()/1000;
application.registeractivitylifecyclecallbacks (new application.activitylifecyclecallbacks ) {
@Override
公共服务活动绑定(活动活动,绑定绑定) {
topActivity=activity.getClass ().getSimpleName );
最大活动,最大活动;
isAppAlive=true;
isSwitchActivity=false;
}
@Override
公共服务活动启动(活动活动) {
}
@Override
公共服务活动保留(活动活动) {
//doyouknowwhythislogicisusedhere? because of the launch mode,whenactivitystartwithsingletaskmode,theonactivitystartedcallbackatopactivity。
if (! activity.getClass ().getSimpleName ) ).equals ) (topactivity ) }{
isSwitchActivity=true;
}else{
isSwitchActivity=false;
}
topActivity=activity.getClass ().getSimpleName );
....
}
@Override
公共语音活动类型支持(活动活动)。
}
@Override
公共服务活动类型(活动活动) {
if(activity.getclass ).getSimpleName ).equals(topactivity ) }
if (! iswitchactivity||map.size(==1) {
………。
}
}
}
@Override
publicvoidonactivitysaveinstancestate (活动活动,绑定绑定) {
}
@Override
公共服务活动描述(活动活动) {
map.remove(activity.getclass ().getSimpleName ) );
if(map.size(==0isappalive ) {
long time end=system.current time millis ()/1000;
if(impl!=空) {
长时间gap=time end-time start;
string online time=string.value of (时间gap;
impl.onreportduration (online time );
time start=系统. current time millis ()/1000;
}
isAppAlive=false;
}
if(map.size ()==0) {
isAppExit=true;
}
}
);
}
公共语音在线(onlineimpl )。
this.impl=impl;
}
}
demo下载位置: