你在运动的时候遇到过这样的情况吗?苦练数小时,却发现App已停止运行,App也没有记录运动,从而失去查看完整运动数据的机会?运动应用程序利用手机或可穿戴设备的传感器来识别运动状态并向用户提供反馈。APP能否在手机后台持续运行,是影响运动数据完整性的关键因素。为了满足用户查看完整运动数据的需求,运动类APP希望在设备后台保持存活状态,通过传感器实时记录用户的运动数据。但大多数手机厂商为了省电,一旦应用进入后台,就会被系统限制甚至强行关闭,导致最终呈现给用户的是不完整的运动记录。如果体育类APP想要实现端侧后台保活,通常有两种方案:引导用户在手机上手动设置保活,比如关闭电池优化,让APP在后台运行。这种方式的缺点是操作步骤比较复杂,用户学习成本较高。这个问题可以通过整合华为的运动健康服务来解决。运动健康服务提供运动记录接口,支持后台保活。集成该能力后,应用可以在用户运动过程中一直在华为手机后台运行,实现用户运动过程。不间断的运动记录。那么如何实现后台保活功能呢?下面是详细的集成步骤。集成步骤参考开发准备完成HealthKit服务的申请,勾选产品必须申请的数据权限,集成SDK。调用后台保活功能需要申请读取运动记录的权限,然后获取用户授权完成权限申请。为了保证你的应用不被系统卡死,你需要开启一个前台服务Foreground服务,调用前台服务中的ActivityRecordsController方法创建一个允许后台运行的动作记录;调用ActivityRecordsController的beginActivityRecord接口开始允许后台运行动作记录,默认会申请权限app后台运行10分钟;//请注意这里的this是Activity对象ActivityRecordsControlleractivityRecordsController=HuaweiHiHealth.getActivityRecordsController(this);//1.构造一条新的运动记录开始时间longstartTime=Calendar.getInstance().getTimeInMillis();//2.构造ActivityRecord对象,设置活动记录的开始时间“)。setActivityTypeId(HiHealthActivities.RUNNING).setStartTime(startTime,TimeUnit.MILLISECONDS).build();//3.构建应用练习记录运行时展示的页面,需要将MyActivity替换为自己的Activity类ComponentNamecomponentName=newComponentName(this,MyActivity.class);//4.构建后台运行状态更改侦听器OnActivityRecordListeneractivityRecordListener=newOnActivityRecordListener(){@OverridepublicvoidonStatusChange(intstatusCode){Log.i("ActivityRecords","onStatusChangestatusCode:"+statusCode);}};//5.调用API接口beginActivityRecordTasktask1开始一条新的活动记录=activityRecordsController.beginActivityRecord(activityRecord,componentName,activityRecordListener);//6.添加启动ActivityRecord成功task1.addOnSuccessListener(newOnSuccessListener(){@OverridepublicvoidonSuccess(VoidaVoid){Log.i("ActivityRecords","MyActivityRecordbeginsuccess");}//7.添加启动ActivityRecord失败}).addOnFailureListener(newOnFailureListener(){@OverridepublicvoidonFailure(Exceptione){StringerrorCode=e.getMessage();StringerrorMsg=HiHealthStatusCodes.getStatusCodeMessage(Integer.parseInt(errorCode));Log.i("ActivityRecords",errorCode+":"+errorMsg);}});如果用户长时间锻炼,每10分钟一次(10分钟以内)需要调用ActivityRecordsController的continueActivityRecord接口继续申请后台保活10分钟;//请注意这里的this是Activity对象ActivityRecordsControlleractivityRecordsController=HuaweiHiHealth.getActivityRecordsController(this);//调用continueActivityRecord方法继续指定的活动记录允许应用在后台运行,入参为ActivityRecord的ID字符串TaskendTask=activityRecordsController.continueActivityRecord("MyBeginActivityRecordId");endTask.addOnSuccessListener(newOnSuccessListener(){@OverridepublicvoidonSuccess(VoidaVoid){Log.i("ActivityRecords","continuebackgroundActivityRecord成功了!");}}).addOnFailureListener(newOnFailureListener(){@OverridepublicvoidonFailure(Exceptione){Log.i("ActivityRecords","continuebackgroundActivityRecorderror");}});当用户运动结束时,调用ActivityRecordsController的endActivityRecord接口停止运动记录,同时取消应用的后台保活;//请注意,这里是Activity对象的最终ActivityRecordsControlleractivityRecordsController=HuaweiHiHealth.getActivityRecordsController(this);//调用endActivityRecord接口停止活动记录,入参为ActivityRecord的ID字符串或null//当入参为ID字符串时,停止当前活动记录applicationwiththespecifiedID//传入参数为null时,停止app当前所有未停止的运动记录。Task>endTask=activityRecordsController.endActivityRecord("MyBeginActivityRecordId");endTask.addOnSuccessListener(newOnSuccessListener>(){@OverridepublicvoidonSuccess(ListactivityRecords){Log.i("ActivityRecords","MyActivityRecordEndsuccess");//返回成功停止的活动记录列表if(activityRecords.size()>0){for(ActivityRecordactivityRecord:activityRecords){DateFormatdateFormat=DateFormat.getDateInstance();DateFormattimeFormat=DateFormat.getTimeInstance();Log.i("ActivityRecords","返回ActivityRecord:"+activityRecord.getName()+"\n\tActivityRecordIdentifieris"+activityRecord.getId()+"\n\tapp创建的ActivityRecordis"+activityRecord.getPackageName()+"\n\tDescription:"+activityRecord.getDesc()+"\n\tStart:"+dateFormat.format(activityRecord.getStartTime(TimeUnit.MILLISECONDS))+""+timeFormat.format(activityRecord.getStartTime(TimeUnit.MILLISECONDS))+"\n\tEnd:"+dateFormat.format(activityRecord.getEndTime(TimeUnit.MILLISECONDS))+""+timeFormat.format(activityRecord.getEndTime(TimeUnit.MILLISECONDS))+"\n\tActivity:"+activityRecord.getActivityType());}}else{//没有停止成功返回nullLog.i("ActivityRecords","MyActivityRecordEndresponseisnull");}}}).addOnFailureListener(newOnFailureListener(){@OverridepublicvoidonFailure(Exceptione){StringerrorCode=e.getMessage();StringerrorMsg=HiHealthStatusCodes.getStatusCodeMessage(Integer.parseInt(errorCode));Log.i("ActivityRecords",errorCode+":"+errorMsg);}});需要注意的是,由于端侧后台保活API是敏感权限,体育类应用在接入时需要人工审核,确保数据安全和流程合规后,才能上传到采集端侧后台保活能力开发文档华为运动健康场景解决方案更多详情>>访问华为开发者联盟官网获取开发指导文档华为移动服务开源仓库地址:GitHub、Gitee关注我们,第一时间了解HMSCore最新技术资讯~