当前位置:网站首页>运动App如何实现端侧后台保活,让运动记录更完整?
运动App如何实现端侧后台保活,让运动记录更完整?
2022-06-30 10:01:00 【HMS Core】
你在锻炼健身时,有没有遇到这样的情况?辛辛苦苦锻炼了几小时,却发现App停止了运行,本次运动并没有被记录到App上,从而失去了一个查看完整运动数据的机会?
运动类App是通过手机或者穿戴设备的传感器,来识别运动状态并反馈给用户的,App能否在手机后台时刻保持运行是影响运动数据完整性的关键因素。为了满足用户查看完整运动数据的需求,运动类App都希望在设备后台保活,并通过传感器实时记录用户的运动数据。但大部分手机厂商为了节省电量,一旦应用处于后台就会被系统限制甚至强制关闭,导致最终呈现给用户的运动记录不完整。
运动类App要想实现端侧后台保活,目前通常有两种解决办法:
引导用户在手机上手动设置保活,如关闭电池优化,允许App后台运行。这种方法缺点在于操作步骤较复杂,用户学习成本较高。
可以通过集成华为运动健康服务来解决此问题,运动健康服务提供支持后台保活的运动记录API,集成该能力后应用能够在用户的锻炼过程中在华为手机后台保持运行,从而实现用户锻炼过程中的运动记录不间断。
那如何实现后台保活功能呢?以下是详细的集成步骤。
集成步骤
请参考开发准备完成申请Health Kit服务,勾选产品必需申请的数据权限并集成SDK。
调用后台保活功能需申请运动记录读取权限,再获取用户授权完成权限申请。
为保证您的应用不被系统冻结,需要开启一个前台服务Foreground services,在前台服务中调用ActivityRecordsController方法创建允许后台运行的运动记录;
调用ActivityRecordsController的beginActivityRecord接口开始允许后台运行的运动记录,默认会申请允许应用后台运行时长10分钟;
// 请注意此处的this为Activity对象ActivityRecordsController activityRecordsController = HuaweiHiHealth.getActivityRecordsController(this); // 1.构造新运动记录开始时间long startTime = Calendar.getInstance().getTimeInMillis(); // 2.构造ActivityRecord对象,设置运动记录开始时间 ActivityRecord activityRecord = new ActivityRecord.Builder() .setId("MyBeginActivityRecordId") .setName("BeginActivityRecord") .setDesc("This is ActivityRecord begin test!") .setActivityTypeId(HiHealthActivities.RUNNING) .setStartTime(startTime, TimeUnit.MILLISECONDS) .build(); // 3.构建应用运动记录运行中展示的页面, MyActivity需替换成自身的Activity类ComponentName componentName = new ComponentName(this, MyActivity.class);// 4.构建运动记录后台运行状态变化监听器OnActivityRecordListener activityRecordListener = new OnActivityRecordListener() { @Override public void onStatusChange(int statusCode) { Log.i("ActivityRecords", "onStatusChange statusCode:" + statusCode); }};// 5.调用启动新运动记录API接口beginActivityRecordTask<Void> task1 = activityRecordsController.beginActivityRecord(activityRecord, componentName, activityRecordListener); // 6.添加启动ActivityRecord成功 task1.addOnSuccessListener(new OnSuccessListener<Void>() { @Override public void onSuccess(Void aVoid) { Log.i("ActivityRecords", "MyActivityRecord begin success"); } // 7.添加启动ActivityRecord失败}).addOnFailureListener(new OnFailureListener() { @Override public void onFailure(Exception e) { String errorCode = e.getMessage(); String errorMsg = HiHealthStatusCodes.getStatusCodeMessage(Integer.parseInt(errorCode)); Log.i("ActivityRecords", errorCode + ": " + errorMsg); } });
- 若用户运动时间较长,每临近10分钟(小于10分钟)需调用ActivityRecordsController的continueActivityRecord接口续申请后台保活10分钟;
// 请注意此处的this为Activity对象ActivityRecordsController activityRecordsController = HuaweiHiHealth.getActivityRecordsController(this); // 调用continueActivityRecord方法为指定运动记录续申请允许后台运行,入参为ActivityRecord的ID字符串 Task<Void> endTask = activityRecordsController.continueActivityRecord("MyBeginActivityRecordId");endTask.addOnSuccessListener(new OnSuccessListener<Void>() { @Override public void onSuccess(Void aVoid) { Log.i("ActivityRecords", "continue backgroundActivityRecord was successful!"); }}).addOnFailureListener(new OnFailureListener() { @Override public void onFailure(Exception e) { Log.i("ActivityRecords", "continue backgroundActivityRecord error"); }});
- 当用户运动结束时,调用ActivityRecordsController的endActivityRecord接口停止该运动记录,同时取消应用后台保活;
// 请注意此处的this为Activity对象final ActivityRecordsController activityRecordsController = HuaweiHiHealth.getActivityRecordsController(this);// 调用endActivityRecord接口停止运动记录,入参为ActivityRecord的ID字符串或者null// 入参为ID字符串时,停止当前应用指定ID的运动记录// 入参为null时,停止该应用当前所有的未停止运动记录Task<List<ActivityRecord>> endTask = activityRecordsController.endActivityRecord("MyBeginActivityRecordId");endTask.addOnSuccessListener(new OnSuccessListener<List<ActivityRecord>>() { @Override public void onSuccess(List<ActivityRecord> activityRecords) { Log.i("ActivityRecords","MyActivityRecord End success"); // 返回停止成功的运动记录列表 if (activityRecords.size() > 0) { for (ActivityRecord activityRecord : activityRecords) { DateFormat dateFormat = DateFormat.getDateInstance(); DateFormat timeFormat = DateFormat.getTimeInstance(); Log.i("ActivityRecords", "Returned for ActivityRecord: " + activityRecord.getName() + "\n\tActivityRecord Identifier is " + activityRecord.getId() + "\n\tActivityRecord created by app is " + 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 { // 没有停止成功返回null Log.i("ActivityRecords","MyActivityRecord End response is null"); } }}).addOnFailureListener(new OnFailureListener() { @Override public void onFailure(Exception e) { String errorCode = e.getMessage(); String errorMsg = HiHealthStatusCodes.getStatusCodeMessage(Integer.parseInt(errorCode)); Log.i("ActivityRecords",errorCode + ": " + errorMsg); }});
需要注意的是,由于端侧后台保活API属于敏感权限,运动类应用接入时需进行人工审核,确保数据安全、流程合规才能上架。
了解更多详情>>
访问华为开发者联盟官网
获取开发指导文档
华为移动服务开源仓库地址:GitHub、Gitee
关注我们,第一时间了解 HMS Core 最新技术资讯~
边栏推荐
- 技能梳理[email protected]在oled上控制一条狗的奔跑
- Action bright: take good care of children's eyes together -- a summary of the field investigation on the implementation of action bright in Guangxi
- 移植完整版RT-Thread到GD32F4XX(详细)
- 【Rust日报】2021-01-23 几个新库发布
- 2022 Season 6 perfect children's model toxon division finals came to a successful conclusion
- 半钢同轴射频线的史密斯圆图查看和网络分析仪E5071C的射频线匹配校准
- 从0使用keil5软件仿真调试GD32F305
- MATLAB image histogram equalization, namely spatial filtering
- Gd32 RT thread RTC driver function
- MySQL log management, backup and recovery of databases (1)
猜你喜欢
MySQL index, transaction and storage engine of database (2)
"Kunming City coffee map" was opened again, and coffee brought the city closer
从0使用keil5软件仿真调试GD32F305
South China Industrial Group launched digital economy and successfully held the city chain technology conference
Use keil5 software to simulate and debug gd32f305 from 0
Why can't you rob scientists of NFT
安徽《合肥市装配式建筑施工图审查设计深度要求》印发;河北衡水市调整装配式建筑预售许可标准
微信推出图片大爆炸功能;苹果自研 5G 芯片或已失败;微软解决导致 Edge 停止响应的 bug|极客头条...
RobotFramework学习笔记:环境安装以及robotframework-browser插件的安装
那个程序员,被打了。
随机推荐
Gd32 RT thread ota/bootloader driver function
Yixian e-commerce released its first quarterly report: adhere to R & D and brand investment to achieve sustainable and high-quality development
技能梳理[email protected]在oled上控制一条狗的奔跑
我在鹅厂淘到了一波“炼丹神器”,开发者快打包
MySQL log management, backup and recovery of databases (2)
转卡通学习笔记
Remember the experience of an internship. It is necessary to go to the pit (I)
Ionic4 drag the ion reorder group component to change the item order
最新SCI影响因子公布:国产期刊最高破46分!网友:算是把IF玩明白了
GD32 RT-Thread OTA/Bootloader驱动函数
js常见问题
TypeScript–es5中的类,继承,静态方法
WGet -- 404 not found due to spaces in URL
Didi open source agile test case management platform!
About Library (function library), dynamic library and static library
mysql数据库基础:存储过程和函数
L'activité "Kunming City coffee map" a rouvert
【Rust日报】2021-01-23 几个新库发布
苹果5G芯片被曝研发失败,QQ密码bug引热议,蔚来回应做空传闻,今日更多大新闻在此...
Foster design method