前言
極光統(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ì)查看


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

這個(gè)界面對(duì)于官網(wǎng)統(tǒng)計(jì)數(shù)據(jù)的刷新時(shí)間也只是一個(gè)大致時(shí)間而已。
ok,今天關(guān)于極光統(tǒng)計(jì)的知識(shí)就講到這里了,謝謝誒