Android 友盟集成

我们都知道,现在是数据时代。数据所赋予的,就是商业价值。当我们开发完成一款应用并上线后,需要即时的跟踪该应用的状态,包括用户量、活跃量、使用时长等数据信息,以便更好地对应用实施运营手段,实现商业价值。当下使用比较多的就是接入友盟的接口了,下面将对应用接入友盟进行记录。

common 集成

首先,从官网下载对应的SDK,包括统计、消息推送、分享SDK,根据需求下载,以AndroidStudio的手动继集成例,
1、选择SDK功能组件并下载后,解压.zip文件得到相应组件包(例如:umeng-common-x.x.x.jar、umeng-analytics-x.x.x.jar等),在Android Studio的项目工程libs目录中拷入相关组件jar包。

2、右键Android Studio的项目工程 —> 选择Open Module Settings —> 在 Project Structure弹出框中 —> 选择 Dependencies选项卡 —> 点击左下“+” —> 选择组件包类型 —> 引入相应的组件包。
注意:umeng-common-x.x.x.jar为基础组件包,必须导入。

3、初始化接口
首先,AndroidManifest清单配置文件方式初始化AppKey和channel,

<meta-data
      android:name="UMENG_APPKEY"
      android:value="YOUR_APP_KEY" />
<meta-data
      android:name="UMENG_CHANNEL"
      android:value="Channel ID" />

然后再项目工程的自定义application中的onCreate方法中添加友盟初始方法:

/**
* 初始化common库
* 参数1:上下文,不能为空
* 参数2:【友盟+】 AppKey 非必须参数,如果Manifest文件中已配置AppKey,该参数可以传空,则使用Manifest中配置的AppKey,否则该参数必须传入。
* 参数3:【友盟+】 Channel 必须参数,如果Manifest文件中已配置Channel,该参数可以传空,则使用Manifest中配置的Channel,否则该参数必须传入
* 参数4:设备类型,UMConfigure.DEVICE_TYPE_PHONE为手机、UMConfigure.DEVICE_TYPE_BOX为盒子,默认为手机
* 参数5:Push推送业务的secret
*/
UMConfigure.init(this, "AppKey", AppUtil.getChannel(this), UMConfigure.DEVICE_TYPE_PHONE, "secret");

值得注意的是,需要提供一下权限:

ACCESS_NETWORK_STATE(必须)    检测联网方式,区分用户设备使用的是2G、3G或是WiFi。
READ_PHONE_STATE(必须)    获取用户设备的IMEI,通过IMEI来唯一的标识用户。
ACCESS_WIFI_STATE(必须)   获取用户设备的mac地址,在平板设备或电视盒子上,无法
通过IMEI标示设备,我们会将mac地址作为用户的唯一标识。
INTERNET(必须)    允许应用程序联网,以便向我们的服务器端发送数据。

通过上面的步骤,友盟初始化就算结束了。通常情况下,我们开发的应用将会在多个渠道上线,这就意味着我们需要打渠道包。我一般采用360加固打渠道包,很方便。除了上面的在AndroidManifest.xml文件里配置渠道接口外,还需要在.gradle文件里添加如下配置:

productFlavors.all {
     flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
}

在通过UMConfigure.init()初始化友盟时,通过下面方法获取渠道包:

public static String getChannel(Context context) {
        try {
            ApplicationInfo appInfo = context.getPackageManager()
                    .getApplicationInfo(context.getPackageName(),
                            PackageManager.GET_META_DATA);
            String UMENG_CHANNEL = appInfo.metaData.getString("UMENG_CHANNEL");
            return UMENG_CHANNEL;
        } catch (Exception e) {
        }
        return "getChannelException";
    }

日志设置:
初始化时可以通过该方法设置组件化的Log是否输出,默认关闭Log输出。

/**
* 设置组件化的Log开关
* 参数: boolean 默认为false,如需查看LOG设置为true
*/
UMConfigure.setLogEnabled(true);

并且可以通过该方法设置日志加密,有效防止网络攻击,提高数据安全性。

/**
* 设置日志加密
* 参数:boolean 默认为false(不加密)
*/
UMConfigure.setEncryptEnabled(true);

基本功能

通过上面的讲解,对友盟接口进行了初始化,下面将对该接口的一些基本功能的使用进行学习。

  • 应用活跃统计:

通常,我们需要知道用户对该应用的时长进行统计,以及在每个页面的停留时间。

Session启动、App使用时长等基础数据统计接口API:
在App中每个Activity的onResume方法中调用 MobclickAgent.onResume(context),onPause方法中调用 MobclickAgent.onPause(context)。

@Override
public void onResume() {
    super.onResume();
    MobclickAgent.onResume(this);
}

@Override
public void onPause() {
    super.onPause();
    MobclickAgent.onPause(this);
}

注意:

确保在所有的Activity中都调用 MobclickAgent.onResume() 和onPause()方法,这两个调用不会阻塞应用程序的主线程,也不会影响应用程序的性能。

如果您的Activity之间有继承或者控制关系,请不要同时在父和子Activity中重复添加nPause和nResume方法,否则会造成重复统计,导致启动次数异常增高。(例如:使用TabHost、TabActivity、ActivityGroup时)。

当应用在后台运行超过30秒(默认)再回到前台,将被认为是两次独立的Session(启动),例如:用户回到home,或进入其他程序,经过一段时间后再返回之前的应用。即被认为是两个独立的Session,当然这个值是可以更改的,

// interval: 单位是毫秒,默认Session间隔时间是30秒
public static void setSessionContinueMillis(long interval);

必须确保在所有页面对应Activity中调用 MobclickAgent.onResume() 和MobclickAgent.onPause()方法,才能够保证获取正确的新增用户、活跃用户、启动次数、使用时长等基本数据。

上面的情况是我们的项目中只存在Activity的情况,那如果项目中包含Fragment的情况呢?
首先先引入一个概念,页面统计,能够获取正确的页面访问路径、访问深度(PV)的数据。通过下面方法进行统计:

public static void onPageStart(String viewName);
public static void onPageEnd(String viewName);

一次成对的 onPageStart -> onPageEnd 调用,对应一次手动页面生命周期统计。如果项目中只有Activity,那么SDK已默认统计了每个Activity的跳转路径。页面统计不需要再添加其他代码。
应用中包含Fragment的情况比较复杂,首先要明确一些概念。

MobclickAgent.onResume() 和MobclickAgent.onPause() 方法是用来统计应用时长的(也就是Session时长,当然还包括一些其他功能)

MobclickAgent.onPageStart()和MobclickAgent.onPageEnd() 方法是用来统计页面跳转的。

在仅有Activity的应用中,SDK自动帮助开发者调用了 2 中的onPageStart/onPageEnd方法,并把Activity 类名作为页面名称统计。但是在包含fragment的程序中我们希望统计更详细的页面,所以需要自己调用onPageStart/onPageEnd方法做更详细的统计。

首先,需要在程序入口处,调用 MobclickAgent.openActivityDurationTrack(false) 禁止默认的页面统计功能,这样将不会再自动统计Activity页面。

然后需要手动添加以下代码:

使用 MobclickAgent.onResume 和 MobclickAgent.onPause方法统计时长, 这和基本统计中的情况一样(针对Activity)。

使用 MobclickAgent.onPageStart 和 MobclickAgent.onPageEnd 方法统计页面(针对页面,页面可能是Activity 也可能是Fragment或View)。
如果页面是直接由Activity实现:

public void onResume() {
    super.onResume();
    MobclickAgent.onPageStart("SplashScreen"); //手动统计页面("SplashScreen"为页面名称,可自定义)
    MobclickAgent.onResume(this); //统计时长
}

public void onPause() {
    super.onPause();
    MobclickAgent.onPageEnd("SplashScreen"); //手动统计页面("SplashScreen"为页面名称,可自定义),必须保证 onPageEnd 在 onPause 之前调用,因为SDK会在 onPause 中保存onPageEnd统计到的页面数据。
    MobclickAgent.onPause(this);
}

如果页面是使用Activity + Fragment实现的,需要在 Activity 中统计时长:

public void onResume() {
    super.onResume();
    MobclickAgent.onResume(this); //统计时长
}
public void onPause() {
    super.onPause();
    MobclickAgent.onPause(this); //统计时长
}

并在其包含的 Fragment 中统计页面:

public void onResume() {
    super.onResume();
    MobclickAgent.onPageStart("MainScreen"); //统计页面("MainScreen"为页面名称,可自定义)
}
public void onPause() {
    super.onPause();
    MobclickAgent.onPageEnd("MainScreen"); 
}
  • 自定义事件统计:

通过友盟提供的接口,我们可以统计到用户在某一事件上的具体行为,以便后续运营推广。事件统计又分为计数、计量统计。
计数统计统计事件的发生次数、独立用户数、事件时长及事件各参数的发生次数、时长,统计相应的PV、UV,其本质是针对字符串信息的计数。使用计数事件需要在后台添加事件时选择”计数事件”。
在希望跟踪的代码部分,调用如下方法:

/*
* context   当前宿主进程的ApplicationContext上下文。
* eventId   为当前统计的事件ID。
* label 事件的标签属性。
* /
public static void onEvent(Context context, String eventID);
public static void onEvent(Context context, String eventID, String label);

比如统计微博应用中”转发”事件发生的次数,那么在转发的函数里调用:

MobclickAgent.onEvent(mContext,"Forward");
MobclickAgent.onEvent(mContext, "Select", "Channel");

考虑事件在不同属性上的取值,可以调用如下方法:

/*
* context   当前宿主进程的ApplicationContext上下文。
* eventId   为当前统计的事件ID。
* label 为当前事件的属性和取值(Key-Value键值对)。
* /
public static void onEvent(Context context, String eventID, Map<String, String> map);

比如统计电商应用中”购买”事件发生的次数,以及购买的商品类型及数量,那么在购买的函数里调用:

HashMap<String,String> map = new HashMap<String,String>();
map.put("type","book");
map.put("quantity","3"); 
MobclickAgent.onEvent(mContext, "purchase", map);

上面提到的计数统计针对的是定性变量,还有一些事件,如上面提到的支付金额、内容浏览数量等是连续变量,对应的统计项是数值类型。开发者需要查看这些事件的数值分布特征,这就需要使用计算事件。
计算事件可以解决的一些问题:
(1)对某个参数值求和
(2)计算某个参数值的单次均值及单用户均值
(3)近似得到某个参数值的概率分布函数
(4)近似得到某个参数值的累计分布函数
使用计算事件需要在后台添加事件时选择”计算事件”,统计一个数值类型的连续变量(该变量必须为整数),用户每次触发的数值的分布情况,如事件持续时间、每次付款金额等,可以调用如下方法:

/*
* context   当前宿主进程的ApplicationContext上下文。
* eventId   为当前统计的事件ID。
* label 为当前事件的属性和取值(Key-Value键值对)。
* 当前事件的数值,取值范围是-2,147,483,648 到 +2,147,483,647 之间的有符号整数,即int 32类型,如果数据超出了该范围,会造成数据丢包,
影响数据统计的准确性。
* /
public static void onEventValue(Context context, String eventID, Map<String, String> map, int du);

比如统计一次音乐播放,包括音乐类型,作者和播放时长,可以在音乐播放结束后这么调用:

int duration = 12000; //开发者需要自己计算音乐播放时长
Map<String, String> map_value = new HashMap<String, String>();
map_value.put("type" , "popular" );
map_value.put("artist" , "JJLin" );   
MobclickAgent.onEventValue(this, "music" , map_value, duration);
  • 错误日志统计

    组件化统计SDK内建JVM层错误统计。SDK通过Thread.UncaughtExceptionHandler 捕获程序崩溃日志,并在程序下次启动时发送到服务器。
    如不需要错误统计功能,可通过此方法关闭:

// isEnable: false-关闭错误统计功能;true-打开错误统计功能(默认打开)
public static void setCatchUncaughtExceptions(boolean isEnable)

如果开发者自己捕获了错误,需要手动上传到【友盟+】服务器可以调用下面方法:

public static void reportError(Context context, String error);   
//或  
public static void reportError(Context context, Throwable e);

比如:

MobclickAgent.reportError(mContext, "Parameter Error");

try {
    // 抛出异常的代码
} catch (Exception e) {
    MobclickAgent.reportError(mContext, e);
}

通过上面的介绍,了解了友盟接口在Android平台上的集成,包括SDK的接入,时长统计、自定义事件、错误日志等相关功能的引入。当然,友盟还提供了消息推送,Share等功能,具体可以参考其官网,根据具体需求接入,以便为我们的产品进行相关的应用。

猜你喜欢

转载自blog.csdn.net/Mr_azheng/article/details/82385128