GA Android SDK 代码详解(Event)


要向 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来进行一些,数据传递,数据共享,数据缓存等操作。

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()