仅仅通过Application监听用户行为及App的在线状态和在线时长

【仅仅通过Application监听用户行为及App的在线状态和在线时长】观书散遗帙,探古穷至妙。这篇文章主要讲述仅仅通过Application监听用户行为及App的在线状态和在线时长相关的知识,希望能为你提供帮助。
先要实现功能,还是先从API去找。看看有没有你想要的。这里其实就是监听App内activity的状态。怎么办?
给个API所在地址:http://www.android-doc.com/reference/android/app/Application.html

仅仅通过Application监听用户行为及App的在线状态和在线时长

文章图片

看到没?这里有个方法registerActivityLifecycleCallbacks ,这不是监听吗?看看回调了啥东西,点进去再看看。
仅仅通过Application监听用户行为及App的在线状态和在线时长

文章图片

我去,这服务不要太好呀。要啥有啥。看到没?所有activity的生命周期都能获取到。所以。怎么用就成了改考虑的问题了。
下面是我做的统计活跃量和时长的
import android.app.Activity; import android.app.Application; import android.content.Context; import android.os.Bundle; import android.util.Log; import java.util.HashMap; import java.util.Map; /** * Created by admin on 2018/3/2. * @authorcxx * note: 根据activity的生命周期来判断用户的操作。在两种情况下结束app计时统计。 * 一种是:当处于栈顶或顶层的activity被挂起,要强制杀掉进程的时候。 * 二种是:当用户逐层退回到最底层的activity,并finish的时候。即:清空activity栈结束app */public class TimeRecord {private boolean isAppAlive = true; //判断app计时是否已经结束,如果结束,但是app并没有被杀掉,用此字段复活计时功能 private boolean isSwitchActivity = false; //用来标记是否为从顶层activity切换到其他层activity private boolean isAppExit = false; //用来标记,程序退出后,application是否完全退出,如果只是activity清空,但是application为退出,则再次进入,触发activeprivate String topActivity ; private MetaClass helper ; private Map< String ,String> map = new HashMap< > (); private long timeStart =0; //开始计时的时间戳private String TAG = "cxx"; public void init(final Context context,MetaClass metaClass){ Application application= (Application)context.getApplicationContext(); //上报活跃量 System.out.println(TAG+"上报活跃量——初始化"); this.helper = metaClass; helper.reportActive(); timeStart = System.currentTimeMillis()/1000; System.out.println(TAG+"开始计时——初始化"+timeStart); application.registerActivityLifecycleCallbacks(new Application.ActivityLifecycleCallbacks() { @Override public void onActivityCreated(Activity activity, Bundle bundle) { topActivity = activity.getClass().getSimpleName(); map.put(topActivity,topActivity); isAppAlive = true; isSwitchActivity = false; System.out.println(TAG+"Created_activity:"+activity.getClass().getSimpleName()); }@Override public void onActivityStarted(Activity activity) { System.out.println(TAG+"Started_activity:"+activity.getClass().getSimpleName()); }@Override public void onActivityResumed(Activity activity) { //为什么要写在这里,由于启动模式的问题。导致以singleTask方式启动的界面,回退时,onActivityStarted里回来的是顶层的activity System.out.println(TAG+"Resumed_activity:"+activity.getClass().getSimpleName()); if(!activity.getClass().getSimpleName().equals(topActivity)){ isSwitchActivity = true; }else{ isSwitchActivity = false; } topActivity=activity.getClass().getSimpleName(); if(!isAppAlive||isAppExit){ isAppExit = false; System.out.println(TAG+"上报活跃量——onResumed"); helper.reportActive(); timeStart = System.currentTimeMillis()/1000; System.out.println(TAG+"开始计时——onResumed"+timeStart); isAppAlive = true; } }@Override public void onActivityPaused(Activity activity) { }@Override public void onActivityStopped(Activity activity) { System.out.println(TAG+"stop_activity:"+activity.getClass().getSimpleName()); System.out.println(TAG+"stop_topActivity:"+topActivity); if(topActivity.equals(activity.getClass().getSimpleName())){ if(!isSwitchActivity){ long timeEnd = System.currentTimeMillis()/1000; if(helper!=null){ long timegap = timeEnd-timeStart; String onlineTime = String.valueOf(timegap); System.out.println(TAG+"计时结束——stopped:"+timeEnd); System.out.println(TAG+"计时结束时长——stopped:"+onlineTime); helper.reportOnline(onlineTime); } isAppAlive=false; }} }@Override public void onActivitySaveInstanceState(Activity activity, Bundle bundle) { }@Override public void onActivityDestroyed(Activity activity) { map.remove(activity.getClass().getSimpleName()); if(map.size()==0& & isAppAlive){ long timeEnd = System.currentTimeMillis()/1000; if(helper!=null){ long timegap = timeEnd-timeStart; String onlineTime = String.valueOf(timegap); System.out.println(TAG+"计时结束——destory:"+timeEnd); System.out.println(TAG+"计时结束时长——destory:"+onlineTime); helper.reportOnline(onlineTime); } isAppAlive = false; } if(map.size() ==0){ isAppExit = true; } } }); }}

 

    推荐阅读