1. 程式人生 > >(二)僅僅通過Application監聽用戶行為及App的在線狀態和在線時長

(二)僅僅通過Application監聽用戶行為及App的在線狀態和在線時長

活躍 and rem HR 再看 andro void put 初始

  先要實現功能,還是先從API去找。看看有沒有你想要的。這裏其實就是監聽App內activity的狀態。怎麽辦?

  給個API所在地址:http://www.android-doc.com/reference/android/app/Application.html

  技術分享圖片

看到沒?這裏有個方法registerActivityLifecycleCallbacks ,這不是監聽嗎?看看回調了啥東西,點進去再看看。

技術分享圖片

我去,這服務不要太好呀。要啥有啥。看到沒?所有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. * @author cxx * note: 根據activity的生命周期來判斷用戶的操作。在兩種情況下結束app計時統計。 * 一種是:當處於棧頂或頂層的activity被掛起,要強制殺掉進程的時候。 * 二種是:當用戶逐層退回到最底層的activity,並finish的時候。即:清空activity棧結束app
*/ public class TimeRecord { private boolean isAppAlive = true; //判斷app計時是否已經結束,如果結束,但是app並沒有被殺掉,用此字段復活計時功能 private boolean isSwitchActivity = false; private boolean isAppExit = false; private 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) { 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; } } }); } }

(二)僅僅通過Application監聽用戶行為及App的在線狀態和在線時長