当前位置:网站首页>How can the sports app keep the end-to-side background alive to make the sports record more complete?
How can the sports app keep the end-to-side background alive to make the sports record more complete?
2022-06-28 16:06:00 【51CTO】
When you're working out , Have you ever encountered such a situation ? Worked hard for hours , But found App Stopped running , This movement has not been recorded App On , Thus, the opportunity to view the complete motion data is lost ?
Sports App It is through the sensor of mobile phone or wearable device , To identify the motion state and feed back to the user ,App Whether the mobile phone can always run in the background is a key factor affecting the integrity of sports data . In order to meet the needs of users to view complete motion data , Sports App All hope to keep alive in the background of the equipment , And the motion data of users are recorded in real time through sensors . But most mobile phone manufacturers are trying to save power , Once the application is in the background, it will be restricted or even forcibly closed by the system , As a result, the motion record finally presented to the user is incomplete . Sports App To realize the end-to-end and back-end protection , There are usually two solutions :
- Guide the user to manually set the keep alive on the mobile phone , If battery optimization is turned off , allow App Background operation . The disadvantage of this method is that the operation steps are complex , User learning costs are high .
- This problem can be solved by integrating Huawei sports health services , The sports health service provides back-end support for keeping alive sports records API, After integrating this capability, the application can keep running in the background of Huawei mobile phones during the user's exercise , So as to realize the uninterrupted movement record during the user's exercise .
How to realize the backstage keep alive function ? Here are the detailed integration steps .
Integration steps
- Please refer to the development preparation completion Application Health Kit service , Check the data permission required for the product and integrate SDK.
- To call the background keep alive function, you need to apply for the permission to read the motion records , Then obtain the user authorization to complete the permission application .
- To ensure that your application is not frozen by the system , You need to start a front desk service Foreground services, Call... In the foreground service ActivityRecordsController Method to create a motion record that is allowed to run in the background ;
- call ActivityRecordsController Of beginActivityRecord The interface starts to allow motion recording to run in the background , By default, the application will be allowed to run in the background 10 minute ;
// Please note that this by Activity object
ActivityRecordsController activityRecordsController = HuaweiHiHealth.getActivityRecordsController(this);
// 1. New tectonic movement record start time
long startTime = Calendar.getInstance().getTimeInMillis();
// 2. structure ActivityRecord object , Set the motion recording start time
ActivityRecord activityRecord = new ActivityRecord.Builder()
.setId("MyBeginActivityRecordId")
.setName("BeginActivityRecord")
.setDesc("This is ActivityRecord begin test!")
.setActivityTypeId(HiHealthActivities.RUNNING)
.setStartTime(startTime, TimeUnit.MILLISECONDS)
.build();
// 3. Build the page displayed during the running of application motion record , MyActivity It needs to be replaced with its own Activity class
ComponentName componentName = new ComponentName(this, MyActivity.class);
// 4. Build a motion recording background running state change listener
OnActivityRecordListener activityRecordListener = new OnActivityRecordListener() {
@Override
public void onStatusChange(int statusCode) {
Log.i("ActivityRecords", "onStatusChange statusCode:" + statusCode);
}
};
// 5. Call to start a new motion record API Interface beginActivityRecord
Task<Void> task1 = activityRecordsController.beginActivityRecord(activityRecord, componentName, activityRecordListener);
// 6. Add startup ActivityRecord success
task1.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
Log.i("ActivityRecords", "MyActivityRecord begin success");
}
// 7. Add startup ActivityRecord Failure
}).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.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- If the user moves for a long time , Every adjacent 10 minute ( Less than 10 minute ) Need to call ActivityRecordsController Of continueActivityRecord The interface continues to apply for background preservation 10 minute ;
// Please note that this by Activity object
ActivityRecordsController activityRecordsController = HuaweiHiHealth.getActivityRecordsController(this);
// call continueActivityRecord Method to apply for permission to run in the background for the specified motion record , The parameter for ActivityRecord Of ID character string
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");
}
});
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- When the user's movement ends , call ActivityRecordsController Of endActivityRecord The interface stops the motion recording , At the same time, cancel the application background preservation ;
// Please note that this by Activity object
final ActivityRecordsController activityRecordsController = HuaweiHiHealth.getActivityRecordsController(this);
// call endActivityRecord Interface stops motion recording , The parameter for ActivityRecord Of ID String or null
// The parameter for ID When the string , Stop the current application assignment ID Movement record of
// The parameter for null when , Stop all current unstopped motion records of the application
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");
// Return the list of motion records that have stopped successfully
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 {
// Failed to stop and return successfully 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);
}
});
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
It should be noted that , Because the end and side backstage are kept alive API Belongs to sensitive permission , The access of sports applications requires manual review , Ensure data security 、 Only process compliance can be put on the shelves .
Learn more >>
obtain Development guidance document
Huawei mobile service open source warehouse address : GitHub
Pay attention to our , The first time to understand HMS Core Latest technical information ~
边栏推荐
- Visual Studio 2010 configuring and using qt5.6.3
- 零钱兑换(动态规划)
- Flutter dart语言特点总结
- 关于针对tron API签名广播时使用curl的json解析问题解决方案及针对json.loads方法的问题记录
- Practice of curve replacing CEPH in Netease cloud music
- Do not use short circuit logic to write STL sorter multi condition comparison
- Qt5.5.1 configuring msvc2010 compiler and WinDbg debugger
- Solution to JSON parsing problem using curl for Tron API signature broadcast and json Problem record of the loads method
- Fleet |「後臺探秘」第 3 期:狀態管理
- Qt create 5.0.3 配置Qt4.8.7
猜你喜欢

See how the interface control devaxpress WinForms creates a virtual keyboard

Visual Studio 2010 配置和使用Qt5.6.3

抖音实战~我关注的博主列表、关注、取关

经典模型——Transformer

Today's sleep quality record is 80 points
PostgreSQL enables grouping statistics by year, month, day, week, hour, minute and second

使用Karmada实现Helm应用的跨集群部署

Fleet | background Discovery issue 3: Status Management

【推荐系统】多任务学习之ESMM模型(更新ing)

Go zero micro Service Practice Series (VII. How to optimize such a high demand)
随机推荐
C语言基础语法
看界面控件DevExpress WinForms如何创建一个虚拟键盘
Tiktok actual battle ~ list of bloggers I follow, follow and check
ROS knowledge points - ROS create workspace
PostgreSQL enables grouping statistics by year, month, day, week, hour, minute and second
北京有哪些牛逼的中小型公司?
Navicat 15 for MySQL
Xinchuang operating system -- kylin kylin desktop operating system (project 10 security center)
Qt5.5.1配置MSVC2010编绎器和windbg调试器
Practice of curve replacing CEPH in Netease cloud music
【MySQL】表连接为什么比子查询快
Expand Disk C (allocate the memory of disk d to Disk C)
Naacl 2022 | distillation of machinetranslation SOTA model
How can the digital intelligent supply chain management platform of the smart Park optimize process management and drive the development of the park to increase speed and quality?
Etcd可视化工具:Kstone简介(一)
REDIS00_详解redis.conf配置文件
The sadness of software testers is Their own technical ability can not meet the requirements of large manufacturers?
ROS knowledge points - definition and use of topic messages
Fleet | "backstage exploration" issue 3: status management
平台即代码的未来是Kubernetes扩展