android自動計步_Android計步模塊實例代碼(類似微信運動)

最近在項目中研究計步模塊,每天0點開始記錄當天的步數,類似微信運動。碰到了不少坑今天有時間整理出來給大家看看。

做之前在google、baidu、github上搜了個遍沒找到好的,大多數都是需要在后臺存活,需要后臺Service。

對于現在的各大手機廠商為了提高電池的續航里程(省電),基本上AlertManager、

android.intent.action.BOOT_COMPLETED、后臺Service都是被干掉的。

后臺保活策略Service,基本上沒什么用,被手機系統干掉只是時間問題,所以我認為最好也不要去做,就算后臺存活了,用戶看到這個app非常費電也會被刪除的。

目前android計步有兩種方式

系統計步芯片

在Android4.4版本之后,部分機型實現了Sensor.TYPE_STEP_COUNTER傳感器,用于紀錄用戶行走的步數。從手機開機開始紀錄,手機關機時重置為0。

這個記步芯片是系統級別的,相對之前老版本的傳感器記步,性能有一些優化:

不會因為App單獨用了記步的功能而額外耗電

系統芯片記步是持續的,能夠優化部分機型后臺不記步的問題。

加速度傳感器計算方式

加速度傳感器非常耗電,導致App的耗電量很高,影響用戶體驗。

需要后臺實時運行才能實現記步的功能,如果App進程被系統或者安全軟件殺死,導致記步功能沒辦法使用

根據以上兩種方式實現計步,手機提供計步傳感器就使用Sensor.TYPE_STEP_COUNTER方式(app后臺關閉也可以計步),如果不提供就使用SensorManager.SENSOR_DELAY_UI方式(app需要保持后臺運行)。

項目結構:

計步Service使用單獨進程,所以使用到進程間通信aidl,todaystepcounterlib為庫文件用于在單獨進程中實現計步算法,app依賴todaystepcounterlib項目獲取當前步數展示。

接入方式:

項目結構app中時如何使用計步模塊的看如下代碼

public class MainActivity extends AppCompatActivity {

private static String TAG = "MainActivity";

private static final int REFRESH_STEP_WHAT = 0;

//循環取當前時刻的步數中間的間隔時間

private long TIME_INTERVAL_REFRESH = 500;

private Handler mDelayHandler = new Handler(new TodayStepCounterCall());

private int mStepSum;

private ISportStepInterface iSportStepInterface;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

Intent intent = new Intent(this, VitalityStepService.class);

startService(intent);

bindService(intent, new ServiceConnection() {

@Override

public void onServiceConnected(ComponentName name, IBinder service) {

iSportStepInterface = ISportStepInterface.Stub.asInterface(service);

try {

mStepSum = iSportStepInterface.getCurrTimeSportStep();

updateStepCount();

} catch (RemoteException e) {

e.printStackTrace();

}

mDelayHandler.sendEmptyMessageDelayed(REFRESH_STEP_WHAT, TIME_INTERVAL_REFRESH);

}

@Override

public void onServiceDisconnected(ComponentName name) {

}

}, Context.BIND_AUTO_CREATE);

}

class TodayStepCounterCall implements Handler.Callback{

@Override

public boolean handleMessage(Message msg) {

switch (msg.what) {

case REFRESH_STEP_WHAT: {

if (null != iSportStepInterface) {

int step = 0;

try {

step = iSportStepInterface.getCurrTimeSportStep();

} catch (RemoteException e) {

e.printStackTrace();

}

if (mStepSum != step) {

mStepSum = step;

updateStepCount();

}

}

mDelayHandler.sendEmptyMessageDelayed(REFRESH_STEP_WHAT, TIME_INTERVAL_REFRESH);

break;

}

}

return false;

}

}

private void updateStepCount() {

Log.e(TAG,"updateStepCount : " + mStepSum);

TextView stepTextView = (TextView)findViewById(R.id.stepTextView);

stepTextView.setText(mStepSum + "步");

}

}

計步策略:

1.如果使用加速度傳感器計步必須要app在后臺存活才可以計步。‘

2.重頭戲是使用計步傳感器實現計步,app在后臺關閉也可以計步。

如下是采用Sensor.TYPE_STEP_COUNTER傳感器實現計步策略:

1. 用戶新安裝app,從用戶第一次打開App開始計步,當天不跨天

2. 用戶一直打開app計步,且跨越0點沒有關閉App

3.用戶打開一次App后臺關閉,跨越0點且0點分隔AlertManager不能自啟動(目前多數手機都是不能啟動的)

4.用戶打開一次app后臺關閉,跨越多個0點且Alertmanager 0點分隔可以啟動

5.用戶開啟一次app且在同一天進行重啟手機(自啟動不好用,很多手機不好用)

6.用戶開啟一次app,開關機跨0點(開機自啟動不好用)

7.用戶開啟一次app,開關機跨0點(開機自啟動可以)

缺陷

1.方案三 跨0點打開app步數算 前一天的,如果跨越多天會導致前一天步數非常大。

2.方案四 跨0點之前的步數會丟失(由于0點分隔AlertManager可以回調,所以可以處理0點之前的數據,以后版本在修復吧)

3.在計步器回調中頻繁調用SharePreference費電

注意:

1.每天早上打開App可以提高幾步精度,和微信步數幾乎一致。

2.每次重啟手機請打開app,會合并步數

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/534499.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/534499.shtml
英文地址,請注明出處:http://en.pswp.cn/news/534499.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python井字棋ai_實現AI下井字棋的alpha-beta剪枝算法(python實現)

代碼參考自中國大學mooc上人工智能與信息社會陳斌老師的算法,我在原來的基礎上增加了玩家輸入的異常捕獲 AlphaBeta剪枝算法是對Minimax方法的優化,能夠極大提高搜索樹的效率,如果對這個算法感興趣的可以去參考相關資料。 當正確理解AlphaBet…

Redis小計(2)

目錄 1.exists命令 2.del命令 3.expire/pexpire命令 4.ttl命令 5.redis對于key過期的刪除策略 1.exists命令 exists X1 X2 X3 X4:返回四個key存在的個數。 2.del命令 del X1 X2:刪除key。 3.expire/pexpire命令 給key設置超時時間。 expire key…

unity 彩帶粒子_iOS動畫開發----粒子系統---彩帶效果

參考博文地址:http://my.oschina.net/u/2340880/blog/485095?fromerrbgjLq4Mw一、粒子發射器iOS中的粒子效果有兩部分組成,一部分為發射器,設置例子發射的宏觀屬性,另一部分是粒子單元,用于設置相應的粒子屬性。粒子發射器是基于…

一秒執行一次_《一秒鐘》:一貫的粗曠式抓大放小,張藝謀的自命題作業總是要觀眾自己再做一遍...

還有不變的永遠在奔跑的大棉褲花棉襖的圓臉妮子,這是導演張藝謀最新作品《一秒鐘》的最直接觀感。張藝謀是個善于從普世情懷處挖掘題材的導演。之前諸多現實題材類型作品,諸如講父子和解的《千里走單騎》、夫妻愛情的《歸來》以及《我的父親母親》&#…

latex 作者加小標_Latex 寫期刊論文的小技巧

在不同文字處理系統(如 MiKTeX, TeX Live, CTeX, cwTex) 或 不同整合開發環境 ( 如Texstudio, WinEdt, TeXstudio, TeXmaker) 中,我用了 Miktex Texstudio 的常用組合 (win10環境中)。1: 先MiKTeX,后Texstudio ;2: 安裝包(packages);3&#…

unity 畸變_unity3d 幾種鏡頭畸變

1.Fisheye distortion 魚眼鏡頭解釋來自百度百科:魚眼鏡頭是一種焦距為16mm或更短的并且視角接近或等于180。 它是一種極端的廣角鏡頭,“魚眼鏡頭”是它的俗稱。為使鏡頭達到最大的攝影視角,這種攝影鏡頭的前鏡片直徑很短且呈拋物狀向鏡頭前…

restfull加簽_SpringBoot RestFull API簽名

一、需求如下對指定的API路徑進行簽名認證,對于沒有指定的無需認證,認證具體到方法。二、查閱資料與開發1.了解JWT,實際上用的開源jjwt2.編寫自定義注解3.編寫攔截器,主要是攔截特定的url進行簽名驗證,這里解析請求的h…

mysql 5.5.18下載_MySQL5.7.18下載和安裝過程圖文詳解

MySql下載1、打開官網找到下載路口,這里直接給出下載的地址2、選擇64位版本3、直接下載MySql5.7.18.1安裝過程1 、運行安裝軟件,接受協議2、選擇默認安裝3、下一步到檢查環境界面,點擊“Execute”執行檢查 (可以后面單獨下載插件安裝)&…

mysql找不到performance_Mysql安裝完畢運行時沒有mysql和performance_schema數據庫_MySQL

Mysql問題 ERROR 1045 (28000): Access denied for user ‘root’’localhost’ (using password: YES)Mysql安裝完畢運行時沒有 mysql 和 performance_schema 數據庫問題一:之前卸載未卸載干凈問題二:沒有管理員權限進入問題三:登錄時&#…

mysql latid1_mysql觸發器的實戰經驗

1 引言Mysql的觸發器和存儲過程一樣,都是嵌入到mysql的一段程序。觸發器是mysql5新增的功能,目前線上鳳巢系統、北斗系統以及哥倫布系統使用的數據庫均是mysql5.0.45版本,很多程序比如fc-star管理端,sfrd(das),dorad…

mysql數據庫sql注入原理_SQL注入原理解析以及舉例1

sql注入是指web應用程序對用戶輸入數據的合法性沒有判斷,導致攻擊者可以構造不同的sql語句來實現對數據庫的操作。sql注入漏洞產生滿足條件:1;用戶能夠控制數據的輸入。2;原本需要執行的代碼,拼接了用戶的輸入。舉例&a…

mysql存儲map數據結構_map數據結構

Go map實現原理 - 戀戀美食的個人空間 - OSCHINA - 中文開源技術交流社區 https://my.oschina.net/renhc/blog/2208417// A header for a Go map.type hmap struct {// Note: the format of the hmap is also encoded in cmd/compile/internal/gc/reflect.go.// Make sure this…

四因素三水平正交表_做論文要用正交表?我打包送給你

正交試驗目前在國內的應用量仍然是比較高的,許多高校畢業生喜歡利用正交試驗來獲取研究數據,最終完成畢業論文的撰寫或者期刊投稿。正交試驗方案的設計,必然要用到(標準)正交表。那么大家都是從哪里獲取正交表的呢?小兵給這方面的…

plsql視圖添加表字段_Oracle-單表多字段查詢(不使用*)

環境:Oracle 11g,plsql 14目的:不使用*,查詢擁有上百個字段的表的所有字段。懶人大法:在文章末尾。sql實現邏輯:1、首先建一張100個字段以上的表,通過excel的方式將表建好后直接復制粘貼到plsql的建表界面。…

mysql 編譯安裝與rpm安裝的區別_編譯安裝與RPM安裝的區別

建議在安裝線上的生產服務器軟件包時都用源碼安裝,這是因為源碼安裝可以自行調整編譯參數,最大化地定制安裝結果。這里以MySQL 5線上環境的編譯安裝來說明之,其編譯參數如下所示:./configure-prefix/usr/local/mysql -without-deb…

python字符串變量s的值是python網絡爬蟲_【Python爬蟲作業】-字符串

一、定義字符串變量1.請定義三個字符串a,b,c值分別為 I,like, python2.請將上面三個變量合并輸出I like pythonaIblikecpythonprint(a)print(b)print(c)print(a,b,c)二、定義一個變量 s sdghHhf 1.請先將變量s的空白符去掉 賦值給新變量s1 打印輸出2.請分別將s1變為全部大寫(命…

lableimg閃退_CV學習筆記(二十五):數據集標注與制作

最近在做一些數據標注的工作,雖然標注數據比較枯燥,但這也是每個做算法的工程師升級打怪的必由之路。使用一些合適的工具往往可以事半功倍,效率UP。一:數據標注流程二:數據處理的一些小代碼1:重命名當得到這…

mysql show profile詳解_SQL 性能分析利器 show profile

本文首發個人公眾號《andyqian》, 期待你的關注~前言在之前的文章中,我們提到過一些慢SQL優化的步驟。其中就包括:使用 explain 關鍵字來查看執行計劃,是否命中索引。通過計算某列的區分度,來判斷該列是否適合新建索引…

php判斷給定的整數是否是2的冪_C++_C語言判斷一個數是否是2的冪次方或4的冪次方,快速判斷一個數是否是2的冪次 - phpStudy...

C語言判斷一個數是否是2的冪次方或4的冪次方快速判斷一個數是否是2的冪次方,若是,并判斷出來是多少次方!將2的冪次方寫成二進制形式后,很容易就會發現有一個特點:二進制中只有一個1,并且1后面跟了n個0&…

python 包編譯安裝mysql_CentOS7編譯安裝MySQL8.0.23和Python3.1.9

卸載mariadbrpm -qa | grep mariadbmariadb-libs-5.5.64-1.el7.x86_64yum remove mariadb-libs.x86_64 -y安裝高版本GCC,解決編譯中會遇到的GCC 5.3 or newer is required (-dumpversion says 4.8.5)cd /optyum install centos-release-scl -yyum install devtoolse…