关于友盟统计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
    评论
实现ViewPager中Fragment的无限循环,可以采用以下几个步骤: 1.在ViewPager的Adapter中重写getCount()方法,将其返回一个较大的值,例如Integer.MAX_VALUE,这样就可以让ViewPager中的Fragment无限循环。 2.在ViewPager的Adapter中重写getItem()方法,将其返回的position取模操作,以确保获取到正确的Fragment。 3.在ViewPager的Adapter中重写getPageTitle()方法,将其返回的title也进行取模操作,以确保获取到正确的title。 下面是一个示例代码: ```java public class MyPagerAdapter extends FragmentPagerAdapter { private static final int NUM_PAGES = 3; private List<Fragment> fragmentList; private List<String> titleList; public MyPagerAdapter(FragmentManager fm) { super(fm); fragmentList = new ArrayList<>(); titleList = new ArrayList<>(); for (int i = 0; i < NUM_PAGES; i++) { fragmentList.add(new MyFragment()); titleList.add("Page " + (i + 1)); } } @Override public Fragment getItem(int position) { return fragmentList.get(position % NUM_PAGES); } @Override public int getCount() { return Integer.MAX_VALUE; } @Override public CharSequence getPageTitle(int position) { return titleList.get(position % NUM_PAGES); } } ``` 在上面的示例代码中,我们将ViewPager中的Fragment数量设置为3,然后在getCount()方法中返回一个较大的值Integer.MAX_VALUE,这样就可以让ViewPager中的Fragment无限循环。在getItem()和getPageTitle()方法中,我们对position取模操作,以确保获取到正确的Fragment和title。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值