鸿蒙多功能工具箱开发实战(二十九)-统计分析与用户行为前言统计分析帮助了解用户行为和应用使用情况。本文将讲解HarmonyOS应用的数据统计和用户行为分析实现。一、统计服务1.1 统计事件定义exportenumEventType{// 页面事件PAGE_VIEWpage_view,PAGE_EXITpage_exit,// 点击事件BUTTON_CLICKbutton_click,ITEM_CLICKitem_click,// 业务事件CALCULATIONcalculation,SEARCHsearch,// 错误事件ERRORerror,CRASHcrash}exportinterfaceAnalyticsEvent{type:EventType name:stringparams?:Recordstring,anytimestamp:number}1.2 统计服务封装exportclassAnalyticsService{privatestaticinstance:AnalyticsServiceprivateeventQueue:AnalyticsEvent[][]privateisUploading:booleanfalseprivateuploadInterval:number60000// 1分钟privateconstructor(){this.startUploadTimer()}staticgetInstance():AnalyticsService{if(!AnalyticsService.instance){AnalyticsService.instancenewAnalyticsService()}returnAnalyticsService.instance}/** * 记录事件 */track(type:EventType,name:string,params?:Recordstring,any):void{constevent:AnalyticsEvent{type,name,params,timestamp:Date.now()}this.eventQueue.push(event)// 队列满时立即上传if(this.eventQueue.length50){this.upload()}}/** * 页面浏览统计 */trackPageView(pageName:string):void{this.track(EventType.PAGE_VIEW,pageName,{referrer:this.getLastPage()})this.setLastPage(pageName)}/** * 按钮点击统计 */trackButtonClick(buttonName:string,extra?:Recordstring,any):void{this.track(EventType.BUTTON_CLICK,buttonName,extra)}/** * 计算统计 */trackCalculation(toolName:string,params:Recordstring,any):void{this.track(EventType.CALCULATION,toolName,params)}/** * 上传事件 */privateasyncupload():Promisevoid{if(this.isUploading||this.eventQueue.length0){return}this.isUploadingtruetry{constevents[...this.eventQueue]this.eventQueue[]awaitthis.sendEvents(events)}catch(e){console.error(Upload analytics failed:,e)}finally{this.isUploadingfalse}}privateasyncsendEvents(events:AnalyticsEvent[]):Promisevoid{consthttpHttpService.getInstance()awaithttp.post(https://analytics.example.com/events,events)}privatestartUploadTimer():void{setInterval((){this.upload()},this.uploadInterval)}privatelastPage:stringprivategetLastPage():string{returnthis.lastPage}privatesetLastPage(page:string):void{this.lastPagepage}}二、用户行为追踪2.1 页面生命周期追踪/** * 可追踪页面基类 */exportabstractclassTrackablePage{protectedpageName:stringaboutToAppear(){// 记录页面进入AnalyticsService.getInstance().trackPageView(this.pageName)console.log(Page${this.pageName}appeared)}aboutToDisappear(){// 记录页面退出AnalyticsService.getInstance().track(EventType.PAGE_EXIT,this.pageName,{duration:this.getPageDuration()})}privatepageStartTime:numberDate.now()privategetPageDuration():number{returnDate.now()-this.pageStartTime}}// 使用示例EntryComponentstruct CalculatorPageextendsTrackablePage{protectedpageNamecalculatorbuild(){Column(){// 页面内容}}}2.2 用户会话管理exportclassSessionManager{privatestaticinstance:SessionManagerprivatesessionId:stringprivatesessionStartTime:number0privatepageViews:number0privateconstructor(){}staticgetInstance():SessionManager{if(!SessionManager.instance){SessionManager.instancenewSessionManager()}returnSessionManager.instance}/** * 开始会话 */startSession():void{this.sessionIdthis.generateSessionId()this.sessionStartTimeDate.now()this.pageViews0AnalyticsService.getInstance().track(EventType.PAGE_VIEW,session_start,{sessionId:this.sessionId})}/** * 结束会话 */endSession():void{constdurationDate.now()-this.sessionStartTime AnalyticsService.getInstance().track(EventType.PAGE_EXIT,session_end,{sessionId:this.sessionId,duration,pageViews:this.pageViews})}/** * 增加页面浏览计数 */incrementPageView():void{this.pageViews}/** * 获取会话信息 */getSessionInfo():{sessionId:stringduration:numberpageViews:number}{return{sessionId:this.sessionId,duration:Date.now()-this.sessionStartTime,pageViews:this.pageViews}}privategenerateSessionId():string{return${Date.now()}-${Math.random().toString(36).substr(2,9)}}}三、数据统计3.1 使用统计exportclassUsageStatistics{/** * 记录工具使用 */staticasyncrecordToolUsage(toolName:string):Promisevoid{constkeytool_usage_${toolName}constprefsawaitPreferencesService.getInstance()constcountawaitprefs.get(key,0)asnumberawaitprefs.put(key,count1)// 更新最后使用时间awaitprefs.put(tool_last_used_${toolName},Date.now())}/** * 获取工具使用次数 */staticasyncgetToolUsageCount(toolName:string):Promisenumber{constprefsawaitPreferencesService.getInstance()returnawaitprefs.get(tool_usage_${toolName},0)asnumber}/** * 获取最常用工具 */staticasyncgetMostUsedTools(limit:number5):PromiseArray{name:string,count:number}{constprefsawaitPreferencesService.getInstance()// 实现获取逻辑return[]}/** * 获取最近使用工具 */staticasyncgetRecentlyUsedTools(limit:number5):Promisestring[]{constprefsawaitPreferencesService.getInstance()// 实现获取逻辑return[]}}3.2 性能统计exportclassPerformanceMonitor{privatestaticmetrics:Mapstring,number[]newMap()/** * 记录性能指标 */staticrecord(name:string,value:number):void{if(!this.metrics.has(name)){this.metrics.set(name,[])}this.metrics.get(name)!.push(value)}/** * 获取统计信息 */staticgetStats(name:string):{avg:numbermax:numbermin:numbercount:number}|null{constvaluesthis.metrics.get(name)if(!values||values.length0){returnnull}return{avg:values.reduce((a,b)ab,0)/values.length,max:Math.max(...values),min:Math.min(...values),count:values.length}}/** * 测量执行时间 */staticasyncmeasureT(name:string,fn:()PromiseT):PromiseT{conststartDate.now()try{returnawaitfn()}finally{constdurationDate.now()-startthis.record(name,duration)}}}四、统计报表4.1 使用报表界面EntryComponentstruct AnalyticsReportPage{StatemostUsedTools:Arrayany[]StatetotalUsage:number0StateavgSessionDuration:number0asyncaboutToAppear(){awaitthis.loadReport()}build(){Column(){NavBar({title:使用统计})// 总览Row(){Column(){Text(总使用次数).fontSize(12).fontColor(#999999)Text(${this.totalUsage}).fontSize(24).fontWeight(FontWeight.Bold)}.layoutWeight(1)Column(){Text(平均会话时长).fontSize(12).fontColor(#999999)Text(${Math.round(this.avgSessionDuration/1000)}秒).fontSize(24).fontWeight(FontWeight.Bold)}.layoutWeight(1)}.width(100%).padding(16)// 最常用工具Text(最常用工具).fontSize(16).fontWeight(FontWeight.Bold).margin({top:24})List(){ForEach(this.mostUsedTools,(item:any,index:number){ListItem(){Row(){Text(${index1}).width(30)Text(item.name).layoutWeight(1)Text(${item.count}次).width(60)}.width(100%).height(48)}})}}}privateasyncloadReport(){this.mostUsedToolsawaitUsageStatistics.getMostUsedTools(10)// 加载其他统计数据}}五、高级分析功能5.1 数据分析流程图用户行为事件采集数据上报数据存储数据分析可视化展示5.2 漏斗分析classFunnelAnalysis{privatestaticsteps:string[][view_home,click_tool,use_feature,complete_action]staticasyncanalyze():PromiseFunnelResult{constresults:number[][]for(conststepofthis.steps){constcountawaitthis.getEventCount(step)results.push(count)}return{steps:this.steps,counts:results,conversionRates:this.calculateRates(results)}}}5.3 留存分析classRetentionAnalysis{staticasynccalculate(day:number):Promisenumber{constnewUsersawaitthis.getNewUsers(day)constactiveUsersawaitthis.getActiveUsers(day7)return(activeUsers/newUsers)*100}}图 1 设置页面用户体验改进六、小结本文详细讲解了统计分析✅ 统计事件定义✅ 统计服务封装✅ 用户行为追踪✅ 使用统计✅ 性能监控✅ 漏斗分析✅ 留存分析系列文章导航下期预告鸿蒙多功能工具箱开发实战(三十)-推送通知与消息处理