運動App如何實現端側後臺保活,讓運動記錄更完整?

来源:https://www.cnblogs.com/hmscore/archive/2022/06/28/16418274.html
-Advertisement-
Play Games

你在鍛煉健身時,有沒有遇到這樣的情況?辛辛苦苦鍛煉了幾小時,卻發現App停止了運行,本次運動並沒有被記錄到App上,從而失去了一個查看完整運動數據的機會? 運動類App是通過手機或者穿戴設備的感測器,來識別運動狀態並反饋給用戶的,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屬於敏感許可權,運動類應用接入時需進行人工審核,確保數據安全、流程合規才能上架。

獲取端側後臺保活能力開發文檔

華為運動健康場景解決方案

瞭解更多詳情>>

訪問華為開發者聯盟官網
獲取開髮指導文檔
華為移動服務開源倉庫地址:GitHubGitee

關註我們,第一時間瞭解 HMS Core 最新技術資訊~


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 鏡像下載、功能變數名稱解析、時間同步請點擊 阿裡雲開源鏡像站 我的ubuntu系統是安裝在 VMware 虛擬機中的,兩者之間經常要互傳文件,下麵介紹4種常用的互傳文件方法。 1. 共用文件夾方式互傳 在虛擬機中需要開啟共用文件夾的功能。首先虛擬機中的ubuntu要求是已經開機了的狀態,然後進行設置:虛擬機 ...
  • 目前 中文網中對於 MacOS 下安裝 PHP 教程比較老,並且我個人感覺很難看懂。我在安裝 PHP 過程中遇到了很多網路中沒有出現過的問題,特此環境配置過程記錄如下。 電腦:MacBook Pro 2020 系統:MacOS Monterey 12.3 安裝 HomeBrew HomeBrew 是 ...
  • 一.前言 CentOS(Community ENTerprise Operating System)是Linux發行版之一,它是來自於Red Hat Enterprise Linux依照開放源代碼規定釋出的源代碼所編譯而成。由於出自同樣的源代碼,因此有些要求高度穩定性的伺服器以CentOS替代商業版 ...
  • 做Java開發的朋友都知道,每次開機啟動一堆的軟體和工具,包括未寫完的文檔,是非常花時間的,加上一桌面的快捷方式,往往不是那麼容易直接找到。windows的自動更新往往在凌晨自動啟動,導致很多軟體被異常關閉,另外該服務往往有大量駐留程式或有大量磁碟IO讓本就不富裕的性能大幅下降!,因此本次記錄如何關 ...
  • 原文鏈接:數據資產為王,解析企業數字化轉型與數據資產管理的關係 視頻回顧:點擊這裡 課件獲取:點擊這裡 一、數據資產背景介紹 隨著企業數字化轉型的深入,數據體量爆炸式增長,如何控制數據生產成本、發現有價值的數據,提高數據ROI,成了企業數字化轉型中後期的關鍵任務,這也是數據資產管理的終極目標。 而在 ...
  • 介紹 作為人類,我們天生就想要即刻擁有東西。即時滿足感是一種強大的力量,當前的實時經濟反映了這一點。業務方之間的事務在實時的數字化,逐漸自動化(M2M通信、物聯網、人工智慧和機器學習)並完成。 根據Volt Active Data的​​等待心理調查​​,當被問及“實時意味著什麼”時,超過70%的受訪 ...
  • 今天日誌出現異常,一步一步debug發現SQL語句返回值出錯,進一步發現是max()函數返回出錯。點擊跳轉解決辦法,趕時間的朋友可以去獲得答案。當然我還是希望大伙看看原由。 select max(HTMBXH) from biz_mn_contract_temp; 返回值按理應該是10 ,結果返回了 ...
  • 體驗簡介 場景將提供一臺配置了CentOS 8.5操作系統的ECS實例(雲伺服器)。通過本教程的操作帶您體驗如何將PolarDB-X通過Canal與ClickHouse進行互通,搭建一個實時分析系統。點擊前往 實驗準備 1. 創建實驗資源 開始實驗之前,您需要先創建ECS實例資源。 在實驗室頁面,單 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...