要向 Google Analytics(分析)发送事件,请使用 HitBuilders.EventBuilder 并发送匹配,如下例所示:
// Get tracker.
Tracker t = ((AnalyticsSampleApp) getActivity().getApplication()).getTracker(
TrackerName.APP_TRACKER);
// Build and send an Event.
t.send(new HitBuilders.EventBuilder()
.setCategory(getString(categoryId))
.setAction(getString(actionId))
.setLabel(getString(labelId))
.build());
这块包含如下知识点:
.getActivity()
getActivity() 方法用于获得当前 Activity 上下文,参考链接 Fragment
Return the Activity this fragment is currently associated with.
.getApplication()
了解getApplication()方法,首先要了解Application类,Android系统自动会为每个程序运行时创建一个Application类的对象且只创建一个,所以Application可以说是单例(singleton)模式的一个类。
Application和Activity,Service一样是Android框架的一个系统组件,当Android程序启动时系统会创建一个Application对象,用来存储系统的一些信息。
Android系统会为每个程序运行时创建一个Application类的对象且仅创建一个,且Application对象的生命周期是整个程序中最长的,它的生命周期就等于这个程序的生命周期。因为它是全局的单例 的,所以在不同的Activity,Service中获得的Application对象都是同一个对象。 所以可以通过Application来进行一些,数据传递,数据共享,数据缓存等操作。
.getTracker()
只有在想要使值成为持久值并应用于多次匹配时,您才应当直接在跟踪器中设置值。
AnalyticsSampleApp
AnalyticsSampleApp 继承自 Application
官方示例代码:
package com.google.android.apps.mobileplayground;
import android.app.Application;
import com.google.android.gms.analytics.GoogleAnalytics;
import com.google.android.gms.analytics.Tracker;
import java.util.HashMap;
/**
* An extension to Application class to provide tracker for analytics purposes. Having the tracker
* instances here allows all the activities to access the same tracker instances. The trackers can
* be initialised on startup or when they are required based on performance requirements.
* 一个对 Application 类的拓展以为分析目的提供一个 tracker(跟踪器)
* 拥有此 tacker 可以允许我们在所有的 activity 中去访问一个相同的 tracker
* 这个跟踪器可以在任意我们需要的位置开启
*/
public class AnalyticsSampleApp extends Application {
// The following line should be changed to include the correct property id.
private static final String PROPERTY_ID = "UA-XXXXX-Y";
/**
* Enum used to identify the tracker that needs to be used for tracking.
*
* A single tracker is usually enough for most purposes. In case you do need multiple trackers,
* storing them all in Application object helps ensure that they are created only once per
* application instance.
*/
public enum TrackerName {
APP_TRACKER, // Tracker used only in this app.
GLOBAL_TRACKER, // Tracker used by all the apps from a company. eg: roll-up tracking.
ECOMMERCE_TRACKER, // Tracker used by all ecommerce transactions from a company.
}
HashMap<TrackerName, Tracker> mTrackers = new HashMap<TrackerName, Tracker>();
public AnalyticsSampleApp() {
super();
}
synchronized Tracker getTracker(TrackerName trackerId) {
if (!mTrackers.containsKey(trackerId)) {
GoogleAnalytics analytics = GoogleAnalytics.getInstance(this);
Tracker t = (trackerId == TrackerName.APP_TRACKER) ? analytics.newTracker(PROPERTY_ID)
: (trackerId == TrackerName.GLOBAL_TRACKER) ? analytics.newTracker(R.xml.global_tracker)
: analytics.newTracker(R.xml.ecommerce_tracker);
mTrackers.put(trackerId, t);
}
return mTrackers.get(trackerId);
}
}
可以看到代码段底部,为 AnalyticsSampleApp 定义了 .getTracker 方法,它定义了一个 TrackerName 和 Tracker 的映射表,以允许我们 通过 TrackerName 获取到相应的 Tracker.
注意!上述代码的生效,依赖于在 AndroidManifest.xml 中注册的 <application android:name="AnalyticsApplication">
.getTracker(TrackerName.APP_TRACKER);
此处即相当于获得默认的 APP_TRACKER 的 Tracker。
通过上述代码可以总结如下结论:发送的 Event hit 使用的默认的 APP_TRACKER,对于 APP_TRACKER 进行的设置,会影响所有 Application 周期内的调用。
GoogleAnalytics.getInstance(this)
.getInstance(this) 可以用于获取 GoogleAnalytics 实例, getInstance(Context)是线程安全的,可以从任何线程调用。建议在应用程序生命周期的早期初始化Google Analytics(分析),以正确报告未处理的异常。应用。onCreate() 是配置Google Analytics(分析)的推荐位置。
Analytics requires INTERNET and ACCESS_NETWORK_STATE permissions.
.newTracker(String trackingId)
GoogleAnalytics 方法,返回一个具有给定 trackingId 的 Tracker 实例。
Tracker (public class)
Tracker 用于构建&发送匹配。
t.send() -> Tracker.send(Map<String, String>params)
通过与跟踪器上先有设置的参数合并,然后生成一个匹配并进行发送。匹配可能不会立刻发送。(这取决于调度时间)
new HitBuilders.EventBuilder()...build() -> HitBuilders
HitBuilders 本质上就是用来帮助构建 hit 参数&值的映射表的,调用 .build() 方法,就完成了一个 Map<parameters, values> 的构建。
所以这块就可以理解,下面这段代码,其实就是完成了一个 Map 的构建,里面包含了比如 ec/ea/el 这样的参数,而如果调用了诸如 .setCustomDimension,其实也只不过是增加了一对参数。 然后在 t.send 的时候,再和 tracker t 里的参数合并,最终完成了一个 hit 参数的构建。
new HitBuilders.EventBuilder()
.setCategory(getString(categoryId))
.setAction(getString(actionId))
.setLabel(getString(labelId))
.build()