極光統(tǒng)計(jì)

前言

極光統(tǒng)計(jì)可以獨(dú)立使用,其配置和極光推送相似

  • 極光統(tǒng)計(jì)配置
  • 極光統(tǒng)計(jì)代碼編寫
  • 極光統(tǒng)計(jì)方法調(diào)用

具體配置請(qǐng)參考
極光推送(一)——配置

一.極光統(tǒng)計(jì)的配置

這里講些配置方面的不同:

jcenter集成和極光推送的基本相同,唯一的區(qū)別在于:
在 module 的 gradle 中添加依賴和AndroidManifest的替換變量:

dependencies {
    ......

    
    //jpush
    compile 'cn.jiguang.sdk:jpush:3.1.0'
    compile 'cn.jiguang.sdk:jcore:1.1.8'
    //極光統(tǒng)計(jì)
    compile 'cn.jiguang.sdk:janalytics:1.1.1'// 此處以JAnalytics 1.1.1 版本為例。
    //    compile 'cn.jiguang.sdk:jcore:1.1.8' // 此處以JCore 1.1.8 版本為例。
    ......
}

若項(xiàng)目中已配置了極光推送,那么你只需要在app的mudel。gradle的依賴中加上以下依賴即可

compile 'cn.jiguang.sdk:janalytics:1.1.1'

若你的項(xiàng)目中之前沒有極光推送的配置,則需要配置完極光統(tǒng)計(jì)的代碼,然后在app的mudel.gradle中配置

compile 'cn.jiguang.sdk:janalytics:1.1.1'// 此處以JAnalytics 1.1.1 版本為例。
compile 'cn.jiguang.sdk:jcore:1.1.8' // 此處以JCore 1.1.8 版本為例。
二.編寫極光統(tǒng)計(jì)方法類

和極光推送處理思路接近,我們一樣希望有一個(gè)類能包含極光統(tǒng)計(jì)的所有方法,這樣我們?cè)谑褂玫臅r(shí)候就可以很方便,現(xiàn)在看看極光統(tǒng)計(jì)類StatsConfig的代碼:

package com.jpushdemo.stats;

import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.os.Bundle;

import com.jpushdemo.app.AppContext;
import com.jpushdemo.util.LogUtil;

import java.util.Map;

import cn.jiguang.analytics.android.api.BrowseEvent;
import cn.jiguang.analytics.android.api.CalculateEvent;
import cn.jiguang.analytics.android.api.CountEvent;
import cn.jiguang.analytics.android.api.Currency;
import cn.jiguang.analytics.android.api.Event;
import cn.jiguang.analytics.android.api.JAnalyticsInterface;
import cn.jiguang.analytics.android.api.LoginEvent;
import cn.jiguang.analytics.android.api.PurchaseEvent;
import cn.jiguang.analytics.android.api.RegisterEvent;

/**
 * Title:極光統(tǒng)計(jì)
 * Description:
 * <p>
 * Created by pei
 * Date: 2017/12/2
 */
public class StatsConfig {

    public static final String KEY_APP_KEY = "JPUSH_APPKEY";

    private Context mContext;

    private StatsConfig() {
        mContext= AppContext.getInstance();
    }

    private static class Holder {
        private static StatsConfig instance = new StatsConfig();
    }

    public static StatsConfig getInstance() {
        return StatsConfig.Holder.instance;
    }

    /**初始化極光,在Application的oncreate()方法中調(diào)用**/
    public void initStats(){
        //極光統(tǒng)計(jì)
        JAnalyticsInterface.setDebugMode(true);
        JAnalyticsInterface.init(mContext);
    }

    /**開啟crashlog日志上報(bào)**/
    public void openCrashLog(){
        JAnalyticsInterface.initCrashHandler(mContext);
    }

    /**關(guān)閉crashlog日志上報(bào)**/
    public void closeCrashLog(){
        JAnalyticsInterface.stopCrashHandler(mContext);
    }

    /**
     * 頁面啟動(dòng)接口。在頁面(activity和fragment)的相關(guān)生命周期內(nèi)調(diào)用,和onPageEnd需要成對(duì)調(diào)用
     * @param context activity的上下文
     * @param pageName 頁面名稱
     */
    public void onPageStart(Context context,String pageName){
        JAnalyticsInterface.onPageStart(context,pageName);
    }

    /**
     * 頁面結(jié)束接口。在頁面(activity和fragment)的相關(guān)生命周期內(nèi)調(diào)用,和onPageStart需要成對(duì)調(diào)用
     * @param context activity的上下文
     * @param pageName 頁面名稱
     */
    public void onPageEnd(Context context,String pageName){
        JAnalyticsInterface.onPageEnd(context,pageName);
    }

    /**
     * 注冊(cè)事件
     * @param context
     * @param extra map的key不能為"register_method","register_success"
     */
    public void onRegisterEvent(Context context,Map<String,String>extra){
        RegisterEvent registerEvent = new RegisterEvent("testRegisterMethod", true);
        //添加自己的Extra 信息
        for (Map.Entry<String,String> entry : extra.entrySet()){
            registerEvent.addKeyValue(entry.getKey(),entry.getValue());
        }
        JAnalyticsInterface.onEvent(context, registerEvent);
    }

    /**
     * 注冊(cè)事件
     *
     * @param context
     * @param registerMethod 注冊(cè)方式
     * @param isSuccess      是否成功
     * @param extra          附加信息 map的key不能為"register_method","register_success"
     */
    public static void onRegisterEvent(Context context,
                                       String registerMethod,
                                       boolean isSuccess,
                                       Map<String, String> extra) {
        Event registerEvent = new RegisterEvent()
                .setRegisterMethod(registerMethod) //注冊(cè)方式
                .setRegisterSuccess(isSuccess) //是否成功
                .addExtMap(extra);
        JAnalyticsInterface.onEvent(context, registerEvent);
    }

    /**
     * 登陸事件
     * @param context
     * @param extra map的key不能為"login_method","login_success"
     */
    public void onLoginEvent(Context context,Map<String,String>extra){
        LoginEvent loginEvent = new LoginEvent("testLoginMethod", true);
        //添加自己的Extra 信息
        for (Map.Entry<String,String> entry : extra.entrySet()){
            loginEvent.addKeyValue(entry.getKey(),entry.getValue());
        }
        JAnalyticsInterface.onEvent(context, loginEvent);
    }

    /**
     * 登錄事件
     *
     * @param context
     * @param loginMethod 登錄方式
     * @param isSuccess   是否成功
     * @param extra       附加信息  map的key不能為"login_method","login_success"
     */
    public static void onLoginEvent(Context context,
                                    String loginMethod,
                                    boolean isSuccess,
                                    Map<String, String> extra) {
        Event loginEvent = new LoginEvent()
                .setLoginMethod(loginMethod) //login方式
                .setLoginSuccess(isSuccess) //是否成功
                .addExtMap(extra);
        JAnalyticsInterface.onEvent(context, loginEvent);
    }

    /**
     * 購買事件
     *
     * @param context
     */
    public static void onPurchaseEvent(Context context,Map<String,String>extra) {
        PurchaseEvent purchaseEvent = new PurchaseEvent("test_purchaseGoodsID", //商品ID
                "籃球", //商品名稱
                300, //商品價(jià)格
                true, //商品購買是否成功
                Currency.CNY, //貨幣類型
                "sport",//商品類型
                1); //商品購買數(shù)量
        //添加自己的Extra 信息
        for (Map.Entry<String,String> entry : extra.entrySet()){
            purchaseEvent.addKeyValue(entry.getKey(),entry.getValue());
        }
        JAnalyticsInterface.onEvent(context, purchaseEvent);
    }

    /**
     * 購買事件
     *
     * @param context
     * @param purchaseGoodsid    物品id,開發(fā)者自己定義
     * @param purchaseGoodsname  購買物品名稱(如lv ,香奈兒,勞力士表,安踏運(yùn)動(dòng)鞋 etc)
     * @param purchasePrice      購買價(jià)格
     * @param purchaseSuccess    購買是否成功
     * @param purchaseCurrency   購買貨幣類型(人民幣(CNY),美元(USD) ,具體參考Currency)
     * @param purchaseGoodsCount 購買數(shù)量
     * @param purchaseGoodstype  購買物品類型(如衣服,手表,鞋子,家用電器etc)
     */
    public static void onPurchaseEvent(Context context,
                                       String purchaseGoodsid,
                                       String purchaseGoodsname,
                                       double purchasePrice,
                                       boolean purchaseSuccess,
                                       Currency purchaseCurrency,
                                       String purchaseGoodstype,
                                       int purchaseGoodsCount,
                                       Map<String, String> extra) {
        Event purchaseEvent = new PurchaseEvent()
                .setPurchaseGoodsid(purchaseGoodsid) //商品ID
                .setPurchaseGoodsname(purchaseGoodsname) //商品名稱
                .setPurchasePrice(purchasePrice) //商品價(jià)格
                .setPurchaseSuccess(purchaseSuccess) //購買是否成功
                .setPurchaseCurrency(purchaseCurrency) //貨幣類型
                .setPurchaseGoodstype(purchaseGoodstype) //商品類型
                .setPurchaseGoodsCount(purchaseGoodsCount)
                .addExtMap(extra);
        JAnalyticsInterface.onEvent(context, purchaseEvent);
    }

    /**
     * 瀏覽事件
     *
     * @param context
     * @param browseId       瀏覽內(nèi)容id,開發(fā)者自己定義
     * @param browseName     瀏覽的內(nèi)容的名稱(如內(nèi)容標(biāo)題等)
     * @param browseType     瀏覽的內(nèi)容類型(如是熱點(diǎn),還是nba,還是cba,還是汽車,財(cái)經(jīng) etc)
     * @param browseDuration 瀏覽的內(nèi)容時(shí)長,單位秒
     * @param extra          附加信息
     */
    public static void onBrowseEvent(Context context,
                                     String browseId,
                                     String browseName,
                                     String browseType,
                                     float browseDuration,
                                     Map<String, String> extra) {
        Event browseEvent = new BrowseEvent()
                .setBrowseId(browseId) //設(shè)置瀏覽內(nèi)容id
                .setBrowseName(browseName) //設(shè)置瀏覽的內(nèi)容的名稱
                .setBrowseType(browseType) //設(shè)置瀏覽的內(nèi)容類型
                .setBrowseDuration(browseDuration) //設(shè)置瀏覽的內(nèi)容時(shí)長
                .addExtMap(extra);
        JAnalyticsInterface.onEvent(context, browseEvent);
    }

    /**
     * 計(jì)算事件
     *
     * @param context
     * @param eventId    事件ID
     * @param eventValue 事件對(duì)應(yīng)的值
     * @param extra      附加信息
     */
    public static void onCalculateEvent(Context context,
                                        String eventId,
                                        double eventValue,
                                        Map<String, String> extra) {
        Event calculateEvent = new CalculateEvent()
                .setEventId(eventId)
                .setEventValue(eventValue)
                .addExtMap(extra);
        JAnalyticsInterface.onEvent(context, calculateEvent);
    }

    /**
     * 計(jì)數(shù)事件
     *
     * @param context
     * @param eventId   事件ID
     * @param extra     附加信息
     */
    public static void onCountEvent(Context context, String eventId, Map<String, String> extra) {
        Event countEvent = new CountEvent()
                .setEventId(eventId)
                .addExtMap(extra);
        JAnalyticsInterface.onEvent(context, countEvent);
    }

    // 取得AppKey
    public static String getAppKey(Context context) {
        Bundle metaData = null;
        String appKey = null;
        try {
            ApplicationInfo ai=context.getPackageManager().getApplicationInfo(context.getPackageName(),PackageManager.GET_META_DATA);
            if(ai!=null){
                metaData = ai.metaData;
            }
            if(null != metaData){
                appKey = metaData.getString(KEY_APP_KEY);
                if ((null == appKey) || appKey.length() != 24) {
                    appKey = null;
                }
            }
        } catch (PackageManager.NameNotFoundException e) {
            LogUtil.e(StatsConfig.class,"===error======"+e.getMessage());
        }
        return appKey;
    }

}

值得注意的是極光統(tǒng)計(jì)和極光推送的配置雖然相似,但他們的功能是單獨(dú)的,也就是當(dāng)我們?nèi)绻恍枰玫綐O光統(tǒng)計(jì)的代碼的時(shí)候,完全可以在配置完極光統(tǒng)計(jì)后,只需要加入StatsConfig ,然后在需要的地方直接調(diào)用就好,而不必考慮是否需要加入極光推送的代碼

三.極光統(tǒng)計(jì)的調(diào)用:

第一步當(dāng)然是在自己項(xiàng)目的application中初始化自己的極光統(tǒng)計(jì)

public class AppContext extends Application{

    private static AppContext INSTANCE;

    public static synchronized AppContext getInstance() {
        return INSTANCE;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        INSTANCE = this;

        //初始化極光統(tǒng)計(jì)
        StatsConfig.getInstance().initStats();
    }
}

然后是在需要使用的地方做調(diào)用,此處只做范例:

//                //注冊(cè)事件
//                Map<String,String>registExtra=new HashMap<>();
//                registExtra.put("registf","注冊(cè)事件啊");
//                StatsConfig.getInstance().onRegisterEvent(mContext,registExtra);
                //登錄事件
                Map<String,String>loginExtra=new HashMap<>();
                loginExtra.put("loginf","登錄事件啊");
                StatsConfig.getInstance().onLoginEvent(mContext,loginExtra);
四.極光統(tǒng)計(jì)查看
3.png
2.png

這里需要注意的是,不是你執(zhí)行了統(tǒng)計(jì)代碼后,你極光官網(wǎng)上立馬就能看到統(tǒng)計(jì)數(shù)據(jù)的,需要過一段時(shí)間才有,至少10分鐘吧,但并不是說10分鐘以后立刻就有,反正是需要一段時(shí)間的

2.png

這個(gè)界面對(duì)于官網(wǎng)統(tǒng)計(jì)數(shù)據(jù)的刷新時(shí)間也只是一個(gè)大致時(shí)間而已。

ok,今天關(guān)于極光統(tǒng)計(jì)的知識(shí)就講到這里了,謝謝誒

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,872評(píng)論 25 709
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,533評(píng)論 19 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 47,261評(píng)論 6 342
  • 01 2014年,母親生病了,輾轉(zhuǎn)多家醫(yī)院,醫(yī)生給出的結(jié)論是--輕度的強(qiáng)迫癥。母親總會(huì)不由自主的幻想一些生活中不會(huì)...
    花隨鶯愿閱讀 529評(píng)論 0 4
  • 8月21日晚董璇在微博曬出全家?!皬?到3,666,六周年”高云翔甜蜜回復(fù)“期待3到4,我們來了”讓眾人揣測(cè)這是要...
    紅小鵲閱讀 461評(píng)論 0 0

友情鏈接更多精彩內(nèi)容