关于友盟统计Viewpager+Fragment实现方式页面统计

在使用友盟统计的时候分为两种页面统计方式: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;
	}


注意:获取当前可见的Activity要添加权限
<uses-permission android:name="android.permission.GET_TASKS"/>











  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值