gpt4 book ai didi

android - Android 应用程序中的 Google Analytics - 处理多项 Activity

转载 作者:IT王子 更新时间:2023-10-28 23:50:10 29 4
gpt4 key购买 nike

看到使用我的应用设置 Google Analytics 是多么容易,我感到非常兴奋,但由于缺乏文档,我不得不坐下来提出几个问题。我能找到的唯一信息来自文档 here ,它只查看来自一个 Activity 的报告 PageViews 和事件。我想在我的应用中跨多个 Activity 报告 PageViews 和事件。

现在在我所有 Activity 的 onCreate() 中,我正在调用:

    tracker = GoogleAnalyticsTracker.getInstance();
tracker.start("UA-xxxxxxxxx", this);

在我所有 Activity 的 onDestroy() 中:

    tracker.stop();

然后我根据需要跟踪 PageViews 和事件,并将它们与我正在执行的另一个 HTTP 请求一起调度。但我不太确定这是最好的方法。我应该在每个 Activity 中调用 start() 和 stop(),还是应该只在主启动器 Activity 中调用 start() 和 stop()?

最佳答案

在每个 Activity 中调用 start()/stop() 的问题(正如 Christian 所建议的那样)是它会导致用户导航到的每个 Activity 都有新的“访问”。如果这对您的使用没问题,那很好,但是,这不是大多数人期望访问工作的方式。例如,这会使将 android 号码与 web 或 iphone 号码进行比较变得非常困难,因为 web 和 iphone 上的“访问”映射到 session ,而不是页面/Activity 。

在您的应用程序中调用 start()/stop() 的问题在于它会导致意外的长时间访问,因为 Android 不保证在您最后一个 Activity 关闭后终止应用程序。此外,如果您的应用程序对通知或服务进行任何操作,这些后台任务可能会启动您的应用程序并导致“幻像”访问。 更新:stefano 正确指出 onTerminate()从未在真实设备上调用过,因此没有明显的地方可以调用 stop()。

在单个“主要” Activity 中调用 start()/stop() 的问题(如 Aurora 所建议的那样)是无法保证该 Activity 会在您的用户使用您的应用程序期间持续存在。如果“主要” Activity 被破坏(比如释放内存),您随后在其他 Activity 中向 GA 写入事件的尝试将失败,因为 session 已停止。

此外,至少在 1.2 版之前,Google Analytics(分析)中存在一个错误,导致它保持对您传递给 start() 的上下文的强引用,从而阻止它在销毁后被垃圾收集。根据上下文的大小,这可能是相当大的内存泄漏。

内存泄漏很容易修复,可以通过使用应用程序而不是 Activity 实例本身调用 start() 来解决。 docs可能应该更新以反射(reflect)这一点。

例如。从您的 Activity 内部:

// Start the tracker in manual dispatch mode...
tracker.start("UA-YOUR-ACCOUNT-HERE", getApplication() );

而不是

// Start the tracker in manual dispatch mode...
tracker.start("UA-YOUR-ACCOUNT-HERE", this ); // BAD

关于何时调用 start()/stop(),您可以实现一种手动引用计数,每次调用 Activity.onCreate() 时递增计数,每次调用 onDestroy() 时递减计数,然后调用 GoogleAnalyticsTracker.stop () 当计数达到零时。

新的EasyTracker来自 Google 的库会为您解决这个问题。

或者,如果您不能子类化 EasyTracker Activity ,您可以在自己的 Activity 基类中自己手动实现:

public abstract class GoogleAnalyticsActivity extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

// Need to do this for every activity that uses google analytics
GoogleAnalyticsSessionManager.getInstance(getApplication()).incrementActivityCount();
}

@Override
protected void onResume() {
super.onResume();

// Example of how to track a pageview event
GoogleAnalyticsTracker.getInstance().trackPageView(getClass().getSimpleName());
}

@Override
protected void onDestroy() {
super.onDestroy();

// Purge analytics so they don't hold references to this activity
GoogleAnalyticsTracker.getInstance().dispatch();

// Need to do this for every activity that uses google analytics
GoogleAnalyticsSessionManager.getInstance().decrementActivityCount();
}

}



public class GoogleAnalyticsSessionManager {
protected static GoogleAnalyticsSessionManager INSTANCE;

protected int activityCount = 0;
protected Integer dispatchIntervalSecs;
protected String apiKey;
protected Context context;

/**
* NOTE: you should use your Application context, not your Activity context, in order to avoid memory leaks.
*/
protected GoogleAnalyticsSessionManager( String apiKey, Application context ) {
this.apiKey = apiKey;
this.context = context;
}

/**
* NOTE: you should use your Application context, not your Activity context, in order to avoid memory leaks.
*/
protected GoogleAnalyticsSessionManager( String apiKey, int dispatchIntervalSecs, Application context ) {
this.apiKey = apiKey;
this.dispatchIntervalSecs = dispatchIntervalSecs;
this.context = context;
}

/**
* This should be called once in onCreate() for each of your activities that use GoogleAnalytics.
* These methods are not synchronized and don't generally need to be, so if you want to do anything
* unusual you should synchronize them yourself.
*/
public void incrementActivityCount() {
if( activityCount==0 )
if( dispatchIntervalSecs==null )
GoogleAnalyticsTracker.getInstance().start(apiKey,context);
else
GoogleAnalyticsTracker.getInstance().start(apiKey,dispatchIntervalSecs,context);

++activityCount;
}


/**
* This should be called once in onDestrkg() for each of your activities that use GoogleAnalytics.
* These methods are not synchronized and don't generally need to be, so if you want to do anything
* unusual you should synchronize them yourself.
*/
public void decrementActivityCount() {
activityCount = Math.max(activityCount-1, 0);

if( activityCount==0 )
GoogleAnalyticsTracker.getInstance().stop();
}


/**
* Get or create an instance of GoogleAnalyticsSessionManager
*/
public static GoogleAnalyticsSessionManager getInstance( Application application ) {
if( INSTANCE == null )
INSTANCE = new GoogleAnalyticsSessionManager( ... ,application);
return INSTANCE;
}

/**
* Only call this if you're sure an instance has been previously created using #getInstance(Application)
*/
public static GoogleAnalyticsSessionManager getInstance() {
return INSTANCE;
}
}

关于android - Android 应用程序中的 Google Analytics - 处理多项 Activity ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3216692/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com