乐趣区

关于android:运动App如何实现端侧后台保活让运动记录更完整

你在锤炼健身时,有没有遇到这样的状况?辛辛苦苦锤炼了几小时,却发现 App 进行了运行,本次静止并没有被记录到 App 上,从而失去了一个查看残缺静止数据的机会?

静止类 App 是通过手机或者穿戴设施的传感器,来辨认静止状态并反馈给用户的,App 是否在手机后盾时刻放弃运行是影响静止数据完整性的关键因素。为了满足用户查看残缺静止数据的需要,静止类 App 都心愿在设施后盾保活,并通过传感器实时记录用户的静止数据。但大部分手机厂商为了节俭电量,一旦利用处于后盾就会被零碎限度甚至强制敞开,导致最终出现给用户的静止记录不残缺。

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

  1. 疏导用户在手机上手动设置保活,如敞开电池优化,容许 App 后盾运行。这种办法毛病在于操作步骤较简单,用户学习老本较高。
  2. 能够通过集成华为静止衰弱服务来解决此问题,静止衰弱服务提供反对后盾保活的静止记录 API,集成该能力后利用可能在用户的锤炼过程中在华为手机后盾放弃运行,从而实现用户锤炼过程中的静止记录不间断。

那如何实现后盾保活性能呢?以下是具体的集成步骤。

集成步骤

  1. 请参考开发筹备实现申请 Health Kit 服务,勾选产品必须申请的数据权限并集成 SDK。
  2. 调用后盾保活性能需申请静止记录读取权限,再获取用户受权实现权限申请。
  3. 为保障您的利用不被零碎解冻,须要开启一个前台服务 Foreground services,在前台服务中调用 ActivityRecordsController 办法创立容许后盾运行的静止记录;
  4. 调用 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 接口 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>() {
    @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. 当用户静止完结时,调用 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 最新技术资讯~

退出移动版