運動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
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...