針對計步模塊進行優化TodayStepCounterV2.0.0.
Android搞計步真是坑爹,每天都能收到很多用戶進行投訴,於是我對投訴進行分析整理出幾個優化點進行優化。
第一篇Android計步模塊優化(今日步數)
Github TodayStepCounter
優化點
- 計步器可以根據需要記錄多天步數。
- 增加根據時間返回步數列表接口。
- 修改Android4.4以下計步算法,開源算法。
- 增加使用文案。
1.計步器可以根據需要記錄多天步數
第一版數據庫中只保存的是當天的以時間分隔的步數。
由於後臺Service不聯網上傳數據需要打開App進行上傳。有很多用戶晚上忘記上傳步數了導致第二天早上看前一天的步數少了很多,其實是晚上沒有打開app上傳步數。
由於這個問題我增加數據庫可以記錄多天步數,第二天用戶早上打開App會上傳當天和前一天的步數。
看如下代碼:
public class TodayStepService extends Service implements Handler.Callback {
private static final String TAG = "TodayStepService";
/**數據庫中保存多少天的運動數據*/
private static final int DB_LIMIT = 2;
......
}
如上代碼DB_LIMIT
爲數據庫中保存幾天的運動數據,我們可以直接修改。
2. 增加根據時間返回步數列表接口
由於數據庫中存儲的是多天的數據,那麼我們就有需要根據時間來查詢某一天的運動數據,或者一段時間間隔的運動數據。
我提供瞭如下接口來獲得。
interface ISportStepInterface {
/**
* 獲取當前時間運動步數
*/
int getCurrentTimeSportStep();
/**
* 獲取所有步數列表,json格式,如果數據過多建議在線程中獲取,否則會阻塞UI線程
*/
String getTodaySportStepArray();
/**
* 根據時間獲取步數列表
*
* @param dateString 格式yyyy-MM-dd
* @return
*/
String getTodaySportStepArrayByDate(String date);
/**
* 根據時間和天數獲取步數列表
* 例如:
* startDate = 2018-01-15
* days = 3
* 獲取 2018-01-15、2018-01-16、2018-01-17三天的步數
*
* @param startDate 格式yyyy-MM-dd
* @param days
* @return
*/
String getTodaySportStepArrayByStartDateAndDays(String date, int days);
}
3. 修改Android4.4以下計步算法,開源算法
Android4.4以下(不包括4.4)版本沒有計步協處理器,只能通過加速度傳感器進行獲取,而且計步Service必須保證在後臺存活,之前找的記步算法也是開源的,但是在很多低端手機上計步非常不準確,總是少了很多步數,有的徹底不記步,於是又在github上重新找了一個算法,雖然這個算法還是有問題,但是比之前的好多了,這個算法需要自己進行優化,由於時間太緊了我也就直接用了,有時間的話還是要好好看看源碼,優化一下。
開源算法這個是源碼,如果有大神對他進行優化,非常歡迎和我進行討論。
4. 增加使用文案。
增加文案也是沒辦法的辦法了,由於用戶不懂規則,或者不會設置後臺自啓動,所以要增加文案,教用戶如何使用計步器。
例如:
- 一些不能後臺的手機需要告訴用戶每天早上打開一次app纔可以正常計步。
- 每天晚上走完需要打開app進行上傳步數,通知欄上的步數是本地的不是服務器上的。
- 如果手機用加速度傳感器進行計步,需要在文案上增加如何使app計步模塊在後臺自啓動,防止被第三方安全軟件殺掉,等等。
測試代碼
public void onClick(View view) {
switch (view.getId()) {
case R.id.stepArrayButton: {
//獲取所有步數列表
if (null != iSportStepInterface) {
try {
String stepArray = iSportStepInterface.getTodaySportStepArray();
mStepArrayTextView.setText(stepArray);
} catch (RemoteException e) {
e.printStackTrace();
}
}
break;
}
case R.id.stepArrayButton1:{
//根據時間來獲取步數列表
if (null != iSportStepInterface) {
try {
String stepArray = iSportStepInterface.getTodaySportStepArrayByDate("2018-01-19");
mStepArrayTextView.setText(stepArray);
} catch (RemoteException e) {
e.printStackTrace();
}
}
break;
}
case R.id.stepArrayButton2:{
//獲取多天步數列表
if (null != iSportStepInterface) {
try {
String stepArray = iSportStepInterface.getTodaySportStepArrayByStartDateAndDays("2018-01-20", 6);
mStepArrayTextView.setText(stepArray);
} catch (RemoteException e) {
e.printStackTrace();
}
}
break;
}
default:
break;
}
}