時間: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統計會將兩個平臺的數據相加么?