import android.app.Service;
import android.content.ContentValues;
import android.content.Intent;
+import android.database.ContentObserver;
+import android.database.Cursor;
import android.net.Uri;
+import android.os.Handler;
+import android.os.HandlerThread;
import android.os.IBinder;
import android.os.PowerManager;
import android.os.RemoteCallbackList;
import com.ic.work.hardware.BloodInfoHelper;
import com.ic.work.hardware.BloodSensorManager;
import com.ic.work.hardware.TemperatureHelper;
+import com.ic.work.utils.HardwareUtils;
import com.ic.work.utils.ICLogger;
import com.ic.work.utils.ICWorkConstants;
import com.ic.work.utils.IcLog;
import com.ic.work.utils.IcSystemProperty;
+import com.ic.work.utils.PedUtil;
+import com.ic.work.utils.SPUtils;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
+import java.math.BigDecimal;
import java.util.concurrent.LinkedBlockingDeque;
import static com.ic.work.utils.ICWorkConstants.Jx.ACTION_AEE_HEART_RATE;
private final Object mLock = new Object();
private PowerManager powerManager;
private PowerManager.WakeLock wakeLock;
+ private HandlerThread handlerThread;
+ private Handler handler;
@Nullable
@Override
//那么就取出下一个任务
TemperatureHelper.getInstance().setTemperatureChangeListener(this);
BloodInfoHelper.getInstance().setHeartRateInfoChangeListener(this);
+ //监听表盘活跃状态
+ //如果改为了true,那么就每2秒种更新一次步数到数据库里
+ //如果为false,则停止任务的执行
+ handlerThread = new HandlerThread("ic:sensor:handler");
+ handlerThread.start();
+ handler = new Handler(handlerThread.getLooper());
+ observerWatchFaceActiveState();
+ }
+
+ private void observerWatchFaceActiveState() {
+ ICLogger.d("observerWatchFaceActiveState...");
+ getContentResolver().registerContentObserver(
+ Uri.parse(SETTINGS + ".watch_face_active_state"),
+ true,
+ contentObserver
+ );
}
+ private final ContentObserver contentObserver = new ContentObserver(null) {
+ @Override
+ public void onChange(boolean selfChange) {
+ handler.post(() -> {
+ handleWatchFaceActiveTask();
+ });
+ }
+ };
+
+ private void handleWatchFaceActiveTask() {
+ ICLogger.d("handleWatchFaceActiveTask...");
+ //获取到状态
+ Cursor cursor = getContentResolver().query(Uri.parse(SETTINGS),
+ new String[]{"s_value"}, "s_key=?",
+ new String[]{"watch_face_active_state"}, null);
+ if (cursor != null) {
+ try {
+ if (cursor.moveToNext()) {
+ String isActive = cursor.getString(0);
+ boolean isActiveValue = Boolean.parseBoolean(isActive);
+ //判断是否活跃
+ ICLogger.d("isActiveValue == > " + isActiveValue);
+ if (isActiveValue) {
+ handler.post(checkPetCountTask);
+ } else {
+ handler.removeCallbacks(checkPetCountTask);
+ }
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ } finally {
+ cursor.close();
+ }
+ }
+ }
+
+ private final Runnable checkPetCountTask = new Runnable() {
+ @Override
+ public void run() {
+ int count = HardwareUtils.getNdkStepCountValue();
+ //把count写到数据库里
+ ContentValues contentValues = new ContentValues();
+ contentValues.put("s_key", "sport_step_count");
+ contentValues.put("s_value", count);
+ getContentResolver().insert(
+ Uri.parse(SensorDataService.SETTINGS), contentValues
+ );
+ ICLogger.d("count == > " + count);
+ //更新卡路里
+ BigDecimal bg = new BigDecimal(PedUtil.calcConsumeEnergy(SPUtils.getPedHeightSP(getBaseContext()),
+ SPUtils.getPedWighttSP(getBaseContext()), count));
+ String value = String.valueOf(bg.setScale(2, BigDecimal.ROUND_HALF_UP).floatValue());
+ //保存一份到数据库中
+ ContentValues contentValuesCalorie = new ContentValues();
+ contentValuesCalorie.put("s_key", "sport_calorie_value");
+ contentValuesCalorie.put("s_value", value);
+ getContentResolver().insert(Uri.parse(SensorDataService.SETTINGS), contentValues);
+ //获取步数,然后入库
+ handler.postDelayed(this, 2000);
+ }
+ };
/**
* 此方法已经是子线程了,不可以再开子线程,包括结果的处理。
);
}
+
/**
* 分发温度数据
*
public void onDestroy() {
super.onDestroy();
mTaskList.clear();
+ //不再监听表盘活跃状态的变化
+ getContentResolver().unregisterContentObserver(contentObserver);
powerManager = null;
EventBus.getDefault().unregister(this);
TemperatureHelper.getInstance().setTemperatureChangeListener(null);