你在锻炼健身时,有没有遇到这样的情况?辛辛苦苦锻炼了几小时,却发现App停止了运行,本次运动并没有被记录到App上,从而失去了一个查看完整运动数据的机会?

运动类App是通过手机或者穿戴设备的传感器,来识别运动状态并反馈给用户的,App能否在手机后台时刻保持运行是影响运动数据完整性的关键因素。为了满足用户查看完整运动数据的需求,运动类App都希望在设备后台保活,并通过传感器实时记录用户的运动数据。但大部分手机厂商为了节省电量,一旦应用处于后台就会被系统限制甚至强制关闭,导致最终呈现给用户的运动记录不完整。

运动类App要想实现端侧后台保活,目前通常有两种解决办法:

  1. 引导用户在手机上手动设置保活,如关闭电池优化,允许App后台运行。这种方法缺点在于操作步骤较复杂,用户学习成本较高。
  1. 可以通过集成华为运动健康服务来解决此问题,运动健康服务提供支持后台保活的运动记录API,集成该能力后应用能够在用户的锻炼过程中在华为手机后台保持运行,从而实现用户锻炼过程中的运动记录不间断。

那如何实现后台保活功能呢?以下是详细的集成步骤。

集成步骤

  1. 请参考开发准备完成申请Health Kit服务,勾选产品必需申请的数据权限并集成SDK。
  1. 调用后台保活功能需申请运动记录读取权限,再获取用户授权完成权限申请。
  1. 为保证您的应用不被系统冻结,需要开启一个前台服务Foreground services,在前台服务中调用ActivityRecordsController方法创建允许后台运行的运动记录;
  1. 调用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() {@Overridepublic void onStatusChange(int statusCode) {Log.i("ActivityRecords", "onStatusChange statusCode:" + statusCode);}
};// 5.调用启动新运动记录API接口beginActivityRecord
Task<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); }
});
  1. 若用户运动时间较长,每临近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>() {@Overridepublic void onSuccess(Void aVoid) {Log.i("ActivityRecords", "continue backgroundActivityRecord was successful!");}
}).addOnFailureListener(new OnFailureListener() {@Overridepublic void onFailure(Exception e) {Log.i("ActivityRecords", "continue backgroundActivityRecord error");}
});
  1. 当用户运动结束时,调用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>>() {@Overridepublic 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 {// 没有停止成功返回nullLog.i("ActivityRecords","MyActivityRecord End response is null");}}
}).addOnFailureListener(new OnFailureListener() {@Overridepublic 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 最新技术资讯~

运动App如何实现端侧后台保活,让运动记录更完整?相关推荐

  1. UI界面教程:用PS设计运动app跑友圈页面

    今天教大家做UI运动app跑友圈页面设计,是运动页面延伸版. 所用软件为:PSCC2018版本,还没有这个软件的小伙伴们 可以关注公号领取:design257,回复:UI必备软件,领取 (喜欢的小伙伴 ...

  2. 运动装备品牌排行榜,2022年最好的运动装备品牌

    运动是一个比较枯燥的过程,不断的身体重复,会让运动者的注意力过度的关注到自己身体的疲惫感并且放大,这个时候我们就可以通过外在的运动装备来消除这些疲劳感,提高自己的运动积极性.不过哪些运动装备好用并适合 ...

  3. AI运动:阿里体育端智能最佳实践

    简介: 过去一年,阿里体育技术团队在端智能方面不断探索,特别在运动健康场景下实现了实践落地和业务赋能,这就是AI运动项目.AI运动项目践行运动数字化的理念,为运动人口的上翻提供了重要支撑,迈出了阿里体 ...

  4. 语音控制小车运动APP(基于百度语音识别)

    语音控制小车运动APP(基于百度语音识别) 项目背景 由于暑期优秀本科生项目需求,开发了一款控制机器人行走的APP,具体要求如下: 在第一个界面(连接界面)实现Socket连接,连接成功则跳转到下一个 ...

  5. 美图App的移动端DNS优化实践:HTTPS请求耗时减小近半...

    本文引用了颜向群发表于高可用架构公众号上的文章<聊聊HTTPS环境DNS优化:美图App请求耗时节约近半案例>的部分内容,感谢原作者. 1.引言 移动互联网时代,APP 厂商之间的竞争非常 ...

  6. 美图App的移动端DNS优化实践:HTTPS请求耗时减小近半

    本文引用了颜向群发表于高可用架构公众号上的文章<聊聊HTTPS环境DNS优化:美图App请求耗时节约近半案例>的部分内容,感谢原作者. 1.引言 移动互联网时代,APP 厂商之间的竞争非常 ...

  7. 《iVX 高仿美团APP制作移动端完整项目》03 推介信息及推荐商家分析及制作

    点击整个专栏查看其它系列文章 (系列文章更新中-):<iVX 高仿美团APP制作移动端完整项目> 项目界面预览: 一.推荐信息制作 推荐信息与之前的标题下推荐信息制作类似: 此时依旧创建一 ...

  8. 《iVX 高仿美团APP制作移动端完整项目》02 搜索、搜索提示及类别需求分析思路及制作流程

    点击整个专栏查看其它系列文章 (系列文章更新中-):<iVX 高仿美团APP制作移动端完整项目> 项目界面预览: 一.搜索制作 在上一节中我们完成了标题头的制作,接下来我们查看如何制作搜索 ...

  9. 《iVX 高仿美团APP制作移动端完整项目》01 标题需求分析思路及制作流程

    点击整个专栏查看其它系列文章 (系列文章更新中-):<iVX 高仿美团APP制作移动端完整项目> 项目界面预览: 一.创建项目 首先打开在线编辑器地址:https://editor.ivx ...

最新文章

  1. 时间序列预测---差分自回归移动平均模型(ARIMA模型)
  2. 【转】复盘一次失败的技术面试后,我成功拿到了5个offer
  3. mybatis教程--查询缓存(一级缓存二级缓存和整合ehcache)
  4. Thinkphp5.1依赖注入、容器、闭包的注入
  5. 关于CRM插件调试方面事
  6. MySQL大批量数据插入
  7. linux去重某一列,Linux shell命令统计某列去重后的值
  8. python等待用户输入指定秒_如何在10秒后强制用户输入
  9. 【UVa10674】Tangents(两圆公切线的切点--验板子题)
  10. 基于vue的手机阅读小说类webapp
  11. 如何将数字转化为中文大写
  12. 入行嵌入式开发若干年悟出的道理
  13. 《加密与解密》笔记五(二)
  14. 2021最新百度、头条等公司Android面试题目,附小技巧
  15. 学号 20172326 《程序设计与数据结构》第八周学习总结
  16. 无线通信基础——“单跳”与“多跳”
  17. Asp.net Core 自带DI依赖注入
  18. 区块链为什么热衷开源?超级账本最有说服力!
  19. 110配线架打法图解_110配线架详解[来自互联网]
  20. Android近期错误

热门文章

  1. IP各号段代表什么意思呢?
  2. 房屋装修选择自装,如何寻找砸墙工程队,比价并施工(砸墙阶段)
  3. linux搭建ftp服务并创建目录,linux搭建ftp服务器
  4. jQuery制作照片墙
  5. 复指数与高斯函数乘积的傅里叶变换_傅里叶变换光学基本原理(一)(理论学习者必看)...
  6. 信息技术(Information Technology)的限定有:硬件 ,软件 , 形式
  7. 入门级普洱生茶的认知,初学茶友必看!
  8. Android中的截屏、录屏、投屏等常用命令和工具
  9. Web前端技术课程设计——技术栈【SpringBoot+Vue+MySQL+MyBatis】的在线英语考试系统
  10. ImageView图片不显示