使用Google Analytics跟踪碎片

Pet*_*vic 28 java android google-analytics

只需知道实施Google分析的正确方法,即可实时跟踪用户何时处于片段中这就是现在所做的事情

@Override
public void onResume() {
    super.onResume();
    Tracker myTracker = parentActivity.getTracker();
    myTracker.setCustomMetric(1, (long) 1);               
    myTracker.sendView("Music View"); 
}
Run Code Online (Sandbox Code Playgroud)

getTracker类在我的主要活动中,只返回主活动中的跟踪器实例

任何帮助将非常感激!

Tia*_*ago 46

Mochini的答案使用Google Analytics V2.Bellow你可以看到如何在V4和V3上做到这一点:

  • V4:

应用:

public class YourApplication extends Application
{
    public synchronized Tracker getTracker() {

        try {
            final GoogleAnalytics googleAnalytics = GoogleAnalytics.getInstance(this);
            return googleAnalytics.newTracker(R.xml.analytics);

        }catch(final Exception e){
            Log.e(TAG, "Failed to initialize Google Analytics V4");
        }

        return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

res/xml/analytics.xml(您可以将其命名为任何内容,不需要将其命名为"analytics")

<?xml version="1.0" encoding="utf-8" ?>
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="TypographyDashes">

  <!--Replace placeholder ID with your tracking ID-->
  <string name="ga_trackingId">UA-XXXXXXXX-X</string>

  <!--Enable automatic activity tracking-->
  <bool name="ga_autoActivityTracking">true</bool>

  <!--Disable automatic exception tracking-->
  <bool name="ga_reportUncaughtExceptions">false</bool>

</resources>
Run Code Online (Sandbox Code Playgroud)

的build.gradle:

compile 'com.google.android.gms:play-services:7.3.0'
Run Code Online (Sandbox Code Playgroud)

片段超类:

public abstract class TrackedFragment extends Fragment{

    @Override
    public void onResume() {

        super.onResume();

        final Tracker tracker = yourApplicationInstance.getTracker();
        if(tracker != null){

            tracker.setScreenName(getClass().getSimpleName());
            tracker.send(new HitBuilders.ScreenViewBuilder().build());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)
  • V3

    import android.os.Bundle;
    import android.support.v4.app.Fragment;
    
    import com.google.analytics.tracking.android.EasyTracker;
    import com.google.analytics.tracking.android.Fields;
    import com.google.analytics.tracking.android.MapBuilder;
    import com.google.analytics.tracking.android.Tracker;
    
    public abstract class TrackedFragment extends Fragment{
    
         private Tracker tracker;
    
         @Override
         public void onActivityCreated(final Bundle savedInstanceState) {
    
             super.onActivityCreated(savedInstanceState);
    
             this.tracker = EasyTracker.getInstance(getActivity());
         }
    
         @Override
         public void onResume() {
    
             super.onResume();
    
             this.tracker.set(Fields.SCREEN_NAME, getClass().getSimpleName());
             this.tracker.send( MapBuilder.createAppView().build() );
         }
    }
    
    Run Code Online (Sandbox Code Playgroud)

资料来源:https://developers.google.com/analytics/devguides/collection/android/v3/migration

  • `getActivity()`将在片段的`onCreate()`中返回null.跟踪器设置应该在`onActivityCreated()`中完成 (10认同)
  • 那么onStop()或onPause()呢?我们是否需要通知GA屏幕不再处于活动状态,或者当另一个屏幕变为活动状态时它是否会知道? (3认同)
  • 此代码将超过用户在"Fragment"上的次数.我会在`onActivityCreate`中初始化`Tracker`(信誉:@KyleIvey).如果您的Fragment使用`setRetainInstanceState(true)`,那么我会更进一步使用全局变量来阻止您在方向更改,切换应用程序等之后发送`MapBuilder`. (2认同)
  • 如果您使用[viewpager中的片段],此方法(使用onResume)将产生错误数据(http://stackoverflow.com/questions/10024739/how-to-determine-when-fragment-becomes-visible-in-viewpager) ; 无论单个片段的可见性如何,您的跟踪事件都将立即触发活动加载,并且当用户在片段中来回移动时,将永远不会再次触发.不幸的是,使用setUserVisibileHint的建议解决方法不能在viewpagers之外工作,所以你必须逐个片段地应用解决方案. (2认同)

小智 9

这个例子使用FragmentActivity和片段:

  1. 在值文件夹(values/analytics.xml)中创建XML文件:

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
    
        <!-- Replace placeholder ID with your tracking ID -->
        <string name="ga_trackingId">XX-xxxxxxxx-x</string>
    
        <!-- Enable Activity tracking -->
        <bool name="ga_autoActivityTracking">true</bool>
    
        <!-- Enable debug -->
        <bool name="ga_debug">true</bool>
    
        <!-- The screen names that will appear in your reporting -->
        <string name="com.example.myapp.FragmentActivity">Fragment activity</string>
    
        <!--
            The inverval of time after all the collected data
            should be sent to the server, in seconds.
        -->
        <integer name="ga_dispatchPeriod">20</integer>
    
    </resources>
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在您的FragmentActivity课程中,添加以下内容:

    @Override
    protected void onStart() {
        super.onStart();
        EasyTracker.getInstance().setContext(this.getBaseContext());
        EasyTracker.getInstance().activityStart(this); // Add this method
    }
    
    @Override
    protected void onStop() {
        super.onStop();
        EasyTracker.getInstance().activityStop(this); // Add this method
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 在包中创建新类: TrackedFragment.java

    public class TrackedFragment extends Fragment {
        private Tracker tracker;
        private String activityId;
        private String fragmentId;
    
        @Override
        public void onCreate(final Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            EasyTracker.getInstance().setContext(getActivity().getApplicationContext());
            this.tracker = EasyTracker.getTracker();
            this.fragmentId = getClass().getSimpleName();
            this.activityId = getActivity().getClass().getSimpleName();
        }
    
        @Override
        public void onResume() {
            super.onResume();
            this.tracker.sendView("/" + this.activityId + "/" + this.fragmentId);
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  4. 最后,您的片段应该从TrackedFragment以下扩展:

    public class NewFragment extends TrackedFragment {
    
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            return inflater.inflate(R.layout.newfragment, null);
        }
    
    }
    
    Run Code Online (Sandbox Code Playgroud)