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


  先要實現功能,還是先從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;  //用來標記是否為從頂層activity切換到其他層activity
    private boolean isAppExit = false;  //用來標記,程序退出后,application是否完全退出,如果只是activity清空,但是application為退出,則再次進入,觸發active

    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) {
                //為什么要寫在這里,由於啟動模式的問題。導致以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;
                }
            }
        });
    }

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM