
基于无感监听实现全局页面埋点
场景描述
当前许多应用都需要实现全局页面埋点能力,例如输出用户使用的页面路径、用户在每个页面的停留时间等,但是navigation路由场景会存在首页为page的情况,这时候使用navDestinationUpdate无法监听到首页的变化,想要在HarmonyOS上实现一个监听navigation所有页面的方法。
此demo暂不支持navigation嵌套场景,复杂场景推荐使用HMRouter。
显示效果
使用navgation路由:
1.首页pushPath到pageOne
2.pushPath到pageTwo
3.remove PageOne
4.返回首页
5.退出应用
使用router路由:
1.Index push到page1
2.replaceUrl到page3
3.返回Index
4.锁屏
核心代码
1.自定义页面对象,统一routerInfo和navInfo,保证每个页面的唯一性。
2.定义一个方法来监听页面。
stack用来存页面栈,其中页面信息的顺序与页面栈一致allInfo存页面以及对应的开始展示的时间。
3.声明全局的页面栈实例,用于缓存不同页面的状态和区分不同窗口的页面。
(1)navDestinationUpdate监听。
注意:navDestinationUpdate此监听是监听navDestination组件的生命周期变化,若存在单独使用navDestination组件的场景(不推荐),或者子窗的场景,这里请绑定NavigationID:
onAppear:将页面信息存入栈中,打印栈中页面路径。
onDisappear:页面退栈,删除页面信息,并打印当前栈中的页面路径。
onShown:将onShown页面移入栈顶,并更新开始展示时间。
onHidden:计算页面展示时间。
(2) navDestinationSwitch监听。
navDestinationUpdate监听无法监听到首页page的变化,navDestinationSwitch可以监听到首页page的变化,首页信息为NavBar
这里只需要补充跳转NavBar以及返回NavBar的场景:
(3) routerPageUpdate监听。
特别说明:navDestinationUpdate与navDestinationSwitch监听无法兼顾到应用后台回到前台以及锁屏解锁的场景(若此时栈中存在navBar+navDestination,同时会触发navBar以及navDestination两个页面的回调),这时候就需要用routerPageUpdate补充,并增加监听使用router路由场景的功能。
大部分逻辑与navDestinationUpdate监听相同,但是在onPageHide展示时间前需要判断此页面是否为栈中最后一个,若为最后一个,则打印。
AboutToAppear:page入栈,打印此时栈中页面信息。
AboutToDisappear:页面出栈,删除页面信息,并打印当前栈中的页面路径。
onPageShow:将onPageShow页面移入栈顶,并更新开始展示时间。
onPageHide:计算页面展示时间。
4.在主窗口创建后开启页面监听(推荐在ability.onWindowStageCreate\(\)中进行)。
5.在子窗口创建后开启页面监听。
常见问题
Q1:如果router与navigation混用能监听到吗
A1:可以,但是更推荐使用navigation作为路由框架,如果使用navigation路由,一个Page+多个NavDestination即可满足路由需求。
Q2:如果一个应用内有多个窗口,对应的页面栈该是否共用?
A2:可以区分开,每个窗口都有自己的页面栈信息。
Q3:navigation嵌套场景能使用吗?
A3:复杂场景推荐使用HMRouter。
