时间:2016年5月10日21:28:50
作者:JustDo23
版本:友盟SDK v5.6.7 (2016-3-25)
官网:友盟官方网站http://www.umeng.com
01. 添加新应用
注册并登陆官方网站,查看相关的集成文档。按照提示在应用管理界面进行新应用的添加。此处主要目的是为了获取AppKey在应用使用。Android和IOS两个平台不能进行共用,需要进行分开。友盟后台的应用名与实际应用名和包名无关,建议命名为“应用名+平台(IOS/Android)”。
02. 导入SDK
对应Eclipse需要进行官方SDK的下载和导入。对于Android Studio可以使用gradle进行集成。
在Gradle依赖中添加:
dependencies {
compile 'com.umeng.analytics:analytics:latest.integration'
}
如果无法正常集成请添加如下代码 :
allprojects {
repositories {
mavenCentral()
}
}
03. 配置AndroidManifest.xml
AndroidManifest.xml的配置主要包括添加权限,填写Appkey和填写渠道id三部分,代码示例如下:
<manifest……>
<uses-sdk android:minSdkVersion="4"></uses-sdk>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
<application ……>
……
<activity ……/>
<meta-data android:value="YOUR_APP_KEY" android:name="UMENG_APPKEY"></meta-data>
<meta-data android:value="Channel ID" android:name="UMENG_CHANNEL"/>
</application>
</manifest>
04. 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()
和MobclickAgent.onPause()
方法,这两个调用将不会阻塞应用程序的主线程,也不会影响应用程序的性能。 - 注意 如果您的Activity之间有继承或者控制关系请不要同时在父和子Activity中重复添加onPause和onResume方法,否则会造成重复统计,导致启动次数异常增高。(eg.使用TabHost、TabActivity、ActivityGroup时)。
- 当应用在后台运行超过30秒(默认)再回到前端,将被认为是两个独立的session(启动),例如用户回到home,或进入其他程序,经过一段时间后再返回之前的应用。可通过接口:
MobclickAgent.setSessionContinueMillis(long interval)
来自定义这个间隔(参数单位为毫秒)。 - 如果开发者调用Process.kill或者System.exit之类的方法杀死进程,请务必在此之前调用
MobclickAgent.onKillProcess(Context context)
方法,用来保存统计数据。 - 非常重要:必须调用
MobclickAgent.onResume()
和MobclickAgent.onPause()
方法,才能够保证获取正确的新增用户、活跃用户、启动次数、使用时长等基本数据。
05. 进行代码添加
- 根据官方文档的提示,初步在
BaseActivity
中的onResume()
和onPause()
两个方法中添加友盟的代码。 - 在
MainActivity
中的回退按钮监听方法onBackPressed()
中添加友盟的MobclickAgent.onKillProcess(Context context)
方法。 - 至此初步完成了集成。如果整个项目仅仅由Activity构成,以上操作基本完成,友盟SDK已默认统计了每个Activity的跳转路径。页面统计不需要再添加其他代码。如果还有其他的那么需要进行往下操作。
06. 明确方法的意义
-
MobclickAgent.onResume()
和MobclickAgent.onPause()
方法是用来统计应用时长的(也就是Session时长,当然还包括一些其他功能) -
MobclickAgent.onPageStart()
和MobclickAgent.onPageEnd()
方法是用来统计页面跳转的 - 以上介绍来自友盟官方文档,写的模棱两可,让人摸不着头绪
07. 针对包含Activity、Fragment或View的应用[自己的项目]
-
在
入口Activity
中也就是SplashActivity
的onCreate()
方法中添加方法。MobclickAgent.openActivityDurationTrack(false);// 禁止默认的页面统计方式,这样将不会再自动统计Activity。
-
在之前代码的基础上添加代码。在
BaseActivity
中的onResume()
和onPause()
两个方法中添加新的代码。代码如下:@Override protected void onResume() { super.onResume(); MobclickAgent.onPageStart("BaseActivity"); // [统计页面(仅有Activity的应用中SDK自动调用,不需要单独写。参数为页面名称,可自定义)] MobclickAgent.onResume(this);// 友盟统计,所有Activity中添加,父类添加后子类不用重复添加 } @Override protected void onPause() { super.onPause(); MobclickAgent.onPageEnd("BaseActivity"); // [(仅有Activity的应用中SDK自动调用,不需要单独写)保证onPageEnd在onPause之前调用,因为onPause中会保存信息。参数页面名称,可自定义] MobclickAgent.onPause(this);// 友盟统计,所有Activity中添加,父类添加后子类不用重复添加 }
-
在
BaseFragmentActivity
中添加如下代码:@Override protected void onResume() { super.onResume(); MobclickAgent.onResume(this);// 友盟统计[统计时长],父类添加后子类不用重复添加 } @Override protected void onPause() { super.onPause(); MobclickAgent.onPause(this);// 友盟统计[统计时长],父类添加后子类不用重复添加 }
-
在
BaseFragment
中添加如下代码:@Override public void onResume() { super.onResume(); MobclickAgent.onPageStart("BaseFragment"); // 统计页面 } @Override public void onPause() { super.onPause(); MobclickAgent.onPageEnd("BaseFragment"); // 统计页面 }
-
注意:这些方法的调用,需要保证线性不交叉,每个
onResume
都对应一个onPause
,每个Start
都有一个End
配对。这样才能保证每个页面统计的正确
08. 调试模式
在 入口Activity
中也就是 SplashActivity
的 onCreate()
方法中添加方法。设置友盟调试模式的开关
MobclickAgent.setDebugMode(DEBUG);// 友盟调试模式开关[打印日志][上线时关闭]
09. 错误统计
-
友盟默认是打开的,不用程序员再次配置。
-
如果自己的项目中有全局的异常捕获,则需要自己查看文档进行相应操作。
-
友盟SDK通过 Thread.UncaughtExceptionHandler 捕获程序崩溃日志,并在程序下次启动时发送到服务器。
-
配置代码如下:
MobclickAgent.setCatchUncaughtExceptions(false);// 关闭错误统计
10. 发送策略
- 当走到这里的时候,整个友盟的集成与配置基本上已经完成。
- 对于发送策略默认是使用的
启动时发送
的策略[在没有获取到在线配置时]。 - 在打开debug调试模式或者使用集成测试时,不受发送策略控制。
11. 集成测试
-
集成测试,需要登录友盟之后添加测试设备,通过测试设备发送的日志来方便开发者来检验自己集成友盟是否有效,是否完整。使用集成测试可以查看包括应用版本、渠道名称、自定义事件、页面访问情况等数据。
-
集成测试时候的测试和真实的数据是相互分离,不用担心两种数据的相互污染。集成测试只能在“管理--集成测试--实时日志”里查看。
-
如果使用普通测试,测试数据会污染真实的用户数据。
-
这里需要注意的是,使用集成测试和普通测试两种的第一步操作是一样的,在入口Activity中添加如下的代码:
MobclickAgent.setDebugMode( true );// 打开调试模式
-
注意:打开调试模式之后,可以在logcat中查看数据是否成功的发送给了友盟服务器,以及在集成过程中的出错原因。友盟相关log的
tag
是MobclickAgent
。
12. 添加设备
- 打开友盟后台之后点击管理-点击集成测试-点击注册设备。进入之后可以看到两种获取设备信息的方法。
- 根据提示获取设置的信息。将界面中的代码进行复制。
完整代码如下:
import android.Manifest;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Build;
import android.text.TextUtils;
/**
* [友盟工具]
*
* @author JustDo23
*/
public class UMengUtil {
/**
* 检查是否具有相关权限[需要6.0及以上版本]
*
* @param context 上下文
* @param permission 被检查的权限
* @return true, 有权限 false,没有权限
*/
@SuppressLint("NewApi")
public static boolean checkPermission(Context context, String permission) {
boolean result = false;
if (Build.VERSION.SDK_INT >= 23) {// 6.0及以上版本
if (context.checkSelfPermission(permission) == PackageManager.PERMISSION_GRANTED) {
result = true;
}
} else {// 6.0以下版本
PackageManager pm = context.getPackageManager();
if (pm.checkPermission(permission, context.getPackageName()) == PackageManager.PERMISSION_GRANTED) {
result = true;
}
}
return result;
}
/**
* 获取手机的设备信息
*
* @param context 上下文
* @return {"device_id": "your_device_id", "mac": "your_device_mac"}
*/
public static String getDeviceInfo(Context context) {
try {
org.json.JSONObject json = new org.json.JSONObject();
android.telephony.TelephonyManager tm = (android.telephony.TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
String device_id = null;
if (checkPermission(context, Manifest.permission.READ_PHONE_STATE)) {
device_id = tm.getDeviceId();// 获取设备号
}
android.net.wifi.WifiManager wifi = (android.net.wifi.WifiManager) context.getSystemService(Context.WIFI_SERVICE);
String mac = wifi.getConnectionInfo().getMacAddress();// 获取MAC地址
json.put("mac", mac);
if (TextUtils.isEmpty(device_id)) {
device_id = mac;
}
if (TextUtils.isEmpty(device_id)) {
device_id = android.provider.Settings.Secure.getString(context.getContentResolver(), android.provider.Settings.Secure.ANDROID_ID);
}
json.put("device_id", device_id);
return json.toString();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
- 在入口Activity中调用
getDeviceInfo()
方法并进行logcat的打印,同时在LogCat中查看到设备的信息,复制到友盟的后台即可。 - 在友盟后台填写设备名称以及复制的设置信息,点击确定,即可。在此设置上打开程序,即可看到实时的新。
- 至此,集成测试中添加设置设备的操作已经完成。
13. 遇到问题以及处理
- 在完成集成测试之后,启动应用并进入到友盟后台进行观察,发下统计到的PageID只有两个
BaseFragment
和BaseActivity
这个和想象中的不一样。- 此时想到在入口Activity中设置了基于Activity的默认的页面统计模式的关闭。尝试将
MobclickAgent.openActivityDurationTrack(false);
中的false
设置为true
后再次进行集成测试。结果发现统计出了所有的BaseActivity
的子类,但是没有统计出任何和Fragment
有关系的界面。
- 此时想到在入口Activity中设置了基于Activity的默认的页面统计模式的关闭。尝试将
14. 页面统计路径
- 在友盟后台,选择应该应用之后,可以选择功能使用,选择页面访问路径,进入之后发现即使是正确集成友盟仍旧没有数据展示。
- 首先,页面访问路径部分数据可以查看所有版本数据,也可以查看单个版本的数据。另外,目前的时间控件支持昨日和自然周维度查看。
- 如果使用了集成测试,那么集成测试的数据和用户的真是数据是相互分离的,不会在这里进行查看。
- 页面访问路径的数据默认情况下是展示昨天的数据。所有当天是无法查看当天的数据的。
- 未加入已选择版本是无法进行查看数据的。因为友盟为了方便开发者对版本进行管理,所以添加版本管理的功能。没有选择版本的情况下是没有数据的。所以只有将某个或某些版本添加到了已选版本队列中,才会有数据被计算。
- 版本隐藏了不会显示。如果该版本数据在设置-版本部分被设置为隐藏,那么该版本数据也会不予以展示。
- 因此,点击左下角的版本管理添加版本之后,第二天进行数据的查看。
补丁
时间:2016年6月19日19:49:39[修改]
作者:JustDo23
简述:功能需要进行添加了。需要进行计数统计。
01. 场景类型设置
之前没有进行设置,这次添加上场景类型的设置。场景类型设置官方接口如下:
MobclickAgent.setScenarioType(Context context, EScenarioType etype)
etype是官方场景,有如下场景:
EScenarioType. E_UM_NORMAL 普通统计场景类型
EScenarioType. E_UM_GAME 游戏场景类型
EScenarioType. E_UM_ANALYTICS_OEM 统计盒子场景类型
EScenarioType. E_UM_GAME_OEM 游戏盒子场景类型
所以,在 入口Activity
中也就是 SplashActivity
的 onCreate()
方法中添加如下代码:
MobclickAgent.setScenarioType(this, MobclickAgent.EScenarioType.E_UM_NORMAL);// 设置统计场景类型为普通统计
02. 自定义事件的统计
在友盟中利用自定义事件统计来实现埋点功能。友盟提供了计数统计
和计算统计
两种。对于两种的概念以及区别,这里不做过多介绍。目前需要实现的功能是计数统计
。
- 计数事件:用于统计字符串型变量的消息数及触发设备数。
- 计算事件:用于统计数值型变量的累计值、均值及分布。
03. 添加事件
在使用计数统计之前,需要先定义相关的事件,也就是需要在Umeng官方网站进行注册事件
操作,主要有事件的ID
、事件的名称
、事件的类型
。注册事件之后服务器才能进行相关的事件处理。需要注意的是事件id可用英文或数字,不要使用中文和特殊字符且不能使用英文句号“.”您可以使用下划线“_”。
注册事件的流程:
- 登录Umeng官网
- 选择需要统计的项目
- 点击统计分析
- 点击设置
- 点击事件
添加事件
需要注意事件ID的填写规则,以及使用正确的事件类型。另外官方问题提示,自定义事件的代码需要放在Activity里的onResume--onPause之间,请在友盟初始化之后调用事件,不支持在service中统计。
04. 添加计数统计代码
简单计数统计的API代码如下:
MobclickAgent.onEvent(Context context, String eventId);
项目中需要统计Banner图片的点击次数,点击之后都会进行页面的跳转,使用以上代码完全可以实现。在图片的点击事件中添加如下的代码:
MobclickAgent.onEvent(mContext, "banner");// 计算统计,注意事件ID
尤其需要注意的是,代码中的事件ID需要和平台注册的事件ID保持一致。
通过集成测试,可以看到统计数据中包含了自定义事件,以及事件的ID。
05. 含有行为属性的计数统计
除了上边介绍的简单计数统计,官方文档中还介绍了另一种,含有行为属性的计数统计。简单说,就是一次计数统计中可以多个属性,这些属性封装在一个Map集合中,键和值需要进行自定义。项目中虽然没有用到这种,可以学习了解一下。将官方文档中的内容复制如下:
考虑事件在不同属性上的取值,可以调用如下方法:
MobclickAgent.onEvent(Context context, String eventId, HashMap map);
map 为当前事件的属性和取值(Key-Value键值对)。
示例:统计电商应用中“购买”事件发生的次数,以及购买的商品类型及数量,那么在购买的函数里调用:
HashMap<String,String> map = new HashMap<String,String>();
map.put("type","book");
map.put("quantity","3");
MobclickAgent.onEvent(mContext, "purchase", map);
06. 小结
从上来看,对于计数统计的实现其实非常简单。
- Umeng官方平台注册事件
- 代码中点击事件调用 MobclickAgent.onEvent 进行统计
07. 疑问
- 在一次打开程序到关闭程序之间,对Banner点击了许多次,Umeng统计会自动累加次数?
- Android和IOS对于同一个埋点,必须设置相同的事件ID么?
- Android和IOS对于同一个埋点,如果设置了相同的事件ID,Umeng统计会将两个平台的数据相加么?
网友评论
Activity 的名称,之后提供一个方法根据 Activity 的名字返回相应的自定义界面名。
你的问题我理解对了么?