首页 > 编程知识 正文

android步数统计,统计数据分析手机软件

时间:2023-05-05 03:12:32 阅读:53127 作者:4841

引言:

许多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下载位置:

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。