在使用友盟统计的时候分为两种页面统计方式:Activity实现和Activity嵌套Fragment实现两种。我们在构建工程的时候一般都会自定义两个父类BaseActivity和BaseFragment,在这两个类中重写它们的两个生命周期方法,onResume和onPause,友盟统计只需要在这两个方法中加入统计代码即可。
在Activity中,添加session和页面统计
@Override
public void onResume() {
super.onResume();
// HomeActivity内嵌套Fragment,应在Fragment中统计页面
// 统计页面(仅有Activity的应用中SDK自动调用,不需要单独写。"SplashScreen"为页面名称,可自定义)
if(!"HomeActivity".equals(ActivityUtil.getRunningActivityName())){
MobclickAgent.onPageStart(ActivityUtil.getRunningActivityName());
}
//统计时长
MobclickAgent.onResume(this);
}
@Override
public void onPause() {
super.onPause();
// HomeActivity内嵌套Fragment,应在Fragment中统计页面
// 统计页面(仅有Activity的应用中SDK自动调用,不需要单独写。"SplashScreen"为页面名称,可自定义)
if(!"HomeActivity".equals(ActivityUtil.getRunningActivityName())){
MobclickAgent.onPageEnd(ActivityUtil.getRunningActivityName());
}
//统计时长
MobclickAgent.onPause(this);
}
在嵌套了Fragment的Activity中,不可以在Activity的生命周期中添加页面统计方法,要在Fragment的生命周期中添加。但是对于使用了Viewpager+Fragment实现的页面来说,Viewpager默认初始化的时候会预加载多余的Fragment,即使预加载的Fragment是我们不可见的,但是该Fragment依然会执行一遍生命周期方法,这个时候对于我们页面统计和页面访问路径来说是不准确的;而且当我们从该Activity跳转到另一个Activity中的时候,Viewpager中的Fragment都会执行onPause方法,当我们返回这个Activity的时候,所有的Fragment都会执行onResume方法。所以,我们在Fragment的生命周期中添加统计代码会造成统计不准确。
我们可以重写Fragment的setUserVisibleHint()方法,这个方法的意思是当前页面用户是否可见,但是不会阻止Fragment的页面加载,由可见----->不可见,相当于Fragment的生命周期onResume---->onPause,所以,我们可以在这个方法中添加友盟统计代码。如下:
private boolean isCreated = false;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
isCreated = true;
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
// 友盟统计页面跳转,重写此方法,可以保证ViewPager切换Fragment时能够准确的记录Fragment之间的跳转
// 不用再调用Fragment的生命周期方法
if (!isCreated){
return;
}
if (isVisibleToUser){
MobclickAgent.onPageStart(ActivityUtil.getCurrentFragmentName(BaseFragment.this)); //统计页面,"MainScreen"为页面名称,可自定义
}else{
MobclickAgent.onPageEnd(ActivityUtil.getCurrentFragmentName(BaseFragment.this));
}
}
通过打印Log日志,我们可以看到此方法的调用顺序,setUserVisibleHint---->onCreate---->setUserVisibleHint---->onCreateView,所以,我们设置了一个布尔变量在加载Fragment的时候,setUserVisibleHint方法直接return。
这里是获取当前可见的Activity名称和Fragment名称的方法,在父类中调用即可。
<span style="white-space:pre"> </span>/**
* 获取当前运行的Activity名称
* @return
<span style="white-space:pre"> </span> */
public static String getRunningActivityName(){
ActivityManager manager = (ActivityManager) AppApplication.getInstance().getSystemService(Context.ACTIVITY_SERVICE);
String activityName = manager.getRunningTasks(1).get(0).topActivity.getClassName();
String name = activityName.substring(activityName.lastIndexOf(".")+1, activityName.length());
return name;
}
/**
* 获取当前显示的Fragment名称
* @return
<span style="white-space:pre"> </span> */
public static String getCurrentFragmentName(BaseFragment fragment){
String fragName = fragment.getClass().toString();
fragName = fragName.substring(fragName.lastIndexOf(".")+1, fragName.length());
return fragName;
}
<uses-permission android:name="android.permission.GET_TASKS"/>