一、友盟初始化和通用接口
1.SDK集成
1.1自动集成
通过在工程build.gradle配置脚本中添加maven线上依赖,导入最新版本组件化基础库和统计SDK。 在Gradle依赖中添加:
dependencies {
compile 'com.umeng.sdk:common:latest.integration'
compile 'com.umeng.sdk:analytics:latest.integration'
}
如果无法正常集成请添加如下配置:
allprojects {
repositories {
mavenCentral()
}
}
2.SDK初始化
2.1 添加初始化方法
在项目工程的自定义application中的onCreate方法中添加
/**
* 参数1:上下文,不能为空
* 参数2:设备类型,UMConfigure.DEVICE_TYPE_PHONE为手机、UMConfigure.DEVICE_TYPE_BOX为盒子,默认为手机
* 参数3:Push推送业务的secret
*/
UMConfigure.init(this, UMConfigure.DEVICE_TYPE_PHONE, "1fe6a20054bcef865eeb0991ee84525b");
注意: 如果项目的Manifest文件中已经配置友盟的appkey和channel,则使用该方法初始化。
参数1:上下文,必须的参数,不能为空
参数2:设备类型,必须参数,传参数为UMConfigure.DEVICE_TYPE_PHONE则表示手机;传参数为UMConfigure.DEVICE_TYPE_BOX则表示盒子;默认为手机
参数3:Push推送业务的secret,需要集成Push功能时必须传入Push的secret,否则传空
2.2 添加相关权限
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /><uses-permission android:name="android.permission.READ_PHONE_STATE" /><uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /><uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
2.3 代码混淆
-keep class com.umeng.commonsdk.** {*;}
2.4 AndroidManifest清单配置文件方式初始化appkey和channel
<manifest><application ……> ……<meta-data android:value="YOUR_APP_KEY" android:name="UMENG_APPKEY"/><meta-data android:value="Channel ID" android:name="UMENG_CHANNEL"/>application>manifest>
3.channel渠道命名规范
1.可以由英文字母、阿拉伯数字、下划线、中划线、空格、括号组成,可以含汉字以及其他明文字符,但是不建议使用中文命名,会出现乱码。
2.首尾字符不可以为空格
3.不要使用纯数字作为渠道ID
4.最多256个字符
5.”unknown” 及其各种大小写形式,作为友盟保留的字段,不可以作为渠道名
在您查看数据时,渠道会作为一个数据细分的维度。
4.常用接口
4.1 设置Log开关
/**
* 参数: boolean 默认为false,如需查看LOG设置为true
*/
UMConfigure.setLogEnabled(true);
4.2 设置日志加密
/**
* 参数:boolean 默认为false(不加密)
*/
UMConfigure.setEncryptEnabled(true);
5.统计
5.1 Session统计
在每个Activity的onResume方法中调用 MobclickAgent.onResume(Context),
onPause方法中调用 MobclickAgent.onPause(Context)
public void onResume() {
super.onResume();
MobclickAgent.onResume(this);
}
public void onPause() {
super.onPause();
MobclickAgent.onPause(this);
}
确保在所有的Activity中都调用 MobclickAgent.onResume() 和onPause()方法,这两个调用将不会阻塞应用程序的主线程,也不会影响应用程序的性能。
注意如果您的Activity之间有继承或者控制关系请不要同时在父和子Activity中重复添加nPause和nResume方法,否则会造成重复统计,导致启动次数异常增高。(eg.使用TabHost、TabActivity、ActivityGroup时)。
当应用在后台运行超过30秒(默认)再回到前端,将被认为是两个独立的session(启动),例如用户回到home,或进入其他程序,经过一段时间后再返回之前的应用。可通过接口:setSessionContinueMillis(long interval) 来自定义这个间隔(参数单位为毫秒)。
如果开发者调用kill或者exit之类的方法杀死进程,请务必在此之前调用onKillProcess(Context context)方法,用来保存统计数据。
5.2 页面的统计
5.2.1 只由Activity构成的应用
如果您已经完成5.1步骤之前的代码添加,那么SDK已默认统计了每个Activity的跳转路径。页面统计不需要再添加其他代码。
5.2.2 包含Activity、Fragment或View的应用
统计应用中包含Fragment的情况比较复杂,首先要明确一些概念。
MobclickAgent.onResume() 和MobclickAgent.onPause() 方法是用来统计应用时长的(也就是Session时长,当然还包括一些其他功能)
MobclickAgent.onPageStart()和MobclickAgent.onPageEnd()方法是用来统计页面跳转的
在仅有Activity的应用中,SDK 自动帮助开发者调用了 2 中的方法,并把Activity 类名作为页面名称统计。但是在包含fragment的程序中我们希望统计更详细的页面,所以需要自己调用方法做更详细的统计。
首先,需要在程序入口处,调用 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"); //统计页面(仅有Activity的应用中SDK自动调用,不需要单独写。"SplashScreen"为页面名称,可自定义)
MobclickAgent.onResume(this); //统计时长
}
public void onPause() {
super.onPause();
MobclickAgent.onPageEnd("SplashScreen"); // (仅有Activity的应用中SDK自动调用,不需要单独写)保证 onPageEnd 在onPause 之前调用,因为 onPause 中会保存信息。"SplashScreen"为页面名称,可自定义
MobclickAgent.onPause(this);
}
如果页面是使用FragmentActivity + Fragment实现的,需要在 FragmentActivity 中统计时长:
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");
}
6.自定义事件统计(数据埋点)
6.1 自定义事件字段说明
event id:自定义事件id
key:自定义事件下的参数
value:自定义事件参数下的参数值
6.2 使用自定义事件的依赖条件
使用自定义事件功能请先登陆 【友盟+】官网 ,在 “统计分析->设置->事件” (子账户由于权限限制可能无法看到”设置”选项,请联系主帐号开通权限。)页面中添加相应的事件id(事件id可用英文或数字,不要使用中文和特殊字符且不能使用英文句号”.”您可以使用下划线”_”),然后服务器才会对相应的事件请求进行处理。
自定义事件的代码需要放在Activity里的nResume–onPause之间,请在sdk初始化之后调用事件,不支持在service中统计。
6.3 计数事件
6.3.1 统计发生次数
在您希望跟踪的代码部分,调用如下方法:
MobclickAgent.onEvent(Context context, String eventId);
context指当前的Activity
eventId为当前统计的事件ID。
示例:统计微博应用中”转发”事件发生的次数,那么在转发的函数里调用
MobclickAgent.onEvent(mContext,"Forward");
6.3.2 统计点击行为各属性被触发的次数
考虑事件在不同属性上的取值,可以调用如下方法:
MobclickAgent.onEvent(Context context, String eventId, HashMap map);
map为当前事件的属性和取值(Key-Value键值对)。
示例:统计电商应用中”购买”事件发生的次数,以及购买的商品类型及数量,那么在购买的函数里调用:
HashMap map = new HashMap();
map.put("type","book");
map.put("quantity","3");
MobclickAgent.onEvent(mContext, "purchase", map);
7. 统计代码混淆
如果您的应用使用了混淆, 请添加
-keepclassmembers class * {
public (org.json.JSONObject);
}
这是由于SDK中的部分代码使用反射来调用构造函数, 如果被混淆掉, 在运行时会提示”NoSuchMethod”错误。 另外,由于SDK需要引用导入工程的资源文件,通过了反射机制得到资源引用文件R.java,但是在开发者通过proguard等混淆/优化工具处理apk时,proguard可能会将R.java删除,如果遇到这个问题,请在proguard配置文件中添加keep命令如:
-keep public class [您的应用包名].R$*{
public static final int *;
}
把[您的应用包名] 替换成您自己的包名,如com.yourcompany.example。如果您使用5.0.0及以上版本的SDK,请添加如下命令:
-keepclassmembers enum * {public static **[] values();public static ** valueOf(java.lang.String);}