在后台获取step传感器数据并存储在SharedReference/sqlite中

pieyvz9o  于 2021-07-05  发布在  Java
关注(0)|答案(1)|浏览(560)

我尝试了很多方法在后台获取传感器数据,并将值存储到共享首选项或sqlite中,但都不起作用。我认为这是因为android oreo的背景限制。
我试过了
带广播接收器的报警管理器
带服务的报警管理器
现在我用的是workmanager。也不太管用。我做错什么了?现在不可能在后台获取传感器数据吗?还有别的办法吗?
主活动.java

  1. protected void onCreate(Bundle savedInstanceState) {
  2. super.onCreate(savedInstanceState);
  3. setContentView(R.layout.activity_main);
  4. localDatabaseHelper = new LocalDatabaseHelper(getApplicationContext());
  5. sharedPreferences = getSharedPreferences("TEST STORAGE", MODE_PRIVATE);
  6. sensorManager = (SensorManager) getApplicationContext().getSystemService(Context.SENSOR_SERVICE);
  7. stepSensor = sensorManager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER);
  8. WorkManager.getInstance(getApplicationContext()).cancelAllWorkByTag("Update-Shared-Preference");
  9. WorkRequest updateSharedPreference = new OneTimeWorkRequest.Builder(UpdateStepWork.class)
  10. .addTag("Update-Shared-Preference")
  11. .build();
  12. WorkManager.getInstance(getApplicationContext()).enqueue(updateSharedPreference);
  13. }

工作

  1. public class UpdateStepWork extends Worker implements SensorEventListener {
  2. private SharedPreferences sharedPreferences;
  3. private SensorManager sensorManager;
  4. private Sensor stepSensor;
  5. private LocalDatabaseHelper localDatabase;
  6. public UpdateStepWork(@NonNull Context context, @NonNull WorkerParameters workerParams) {
  7. super(context, workerParams);
  8. }
  9. @NonNull
  10. @Override
  11. public Result doWork() {
  12. Log.i("WORK", "STARTED");
  13. sharedPreferences = getApplicationContext().getSharedPreferences("TEST STORAGE", Context.MODE_PRIVATE);
  14. sensorManager = (SensorManager) getApplicationContext().getSystemService(Context.SENSOR_SERVICE);
  15. stepSensor = sensorManager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER);
  16. localDatabase = new LocalDatabaseHelper(getApplicationContext());
  17. WorkManager.getInstance(getApplicationContext()).cancelAllWorkByTag("Update-Shared-Preference");
  18. WorkRequest updateSharedPreference = new OneTimeWorkRequest.Builder(UpdateStepWork.class)
  19. .setInitialDelay(5, TimeUnit.SECONDS)
  20. .addTag("Update-Shared-Preference")
  21. .build();
  22. WorkManager.getInstance(getApplicationContext()).enqueue(updateSharedPreference);
  23. sensorManager.unregisterListener(this, stepSensor);
  24. if(sensorManager.registerListener(this, stepSensor, SensorManager.SENSOR_DELAY_NORMAL)){
  25. return Worker.Result.success();
  26. }else
  27. return Worker.Result.failure();
  28. }
  29. @Override
  30. public void onSensorChanged(SensorEvent event) {
  31. int steps = (int) event.values[0];
  32. Log.i("Steps from sensor", steps + "");
  33. if(sharedPreferences.edit().putInt("steps", steps).commit()){
  34. Log.i("Shared Preference", "SUCCESS STORED: " + steps);
  35. if(localDatabase.updateDailyData(steps)){
  36. Log.i("LOCAL DATABASE", "SUCCESS AT " + getCurrentTimeStamp());
  37. Cursor data = localDatabase.getData();
  38. while (data.moveToNext()) {
  39. Log.i("DATA", data.getString(0) + " " + data.getInt(1));
  40. }
  41. }
  42. }else{
  43. Log.i("Shared Preference", "FAILED STORED: " + steps);
  44. }
  45. sensorManager.unregisterListener(this, stepSensor);
  46. sensorManager = null;
  47. }
7fhtutme

7fhtutme1#

在后台收集传感器数据的典型方法是使用前台服务。
共享引用不是存储传感器数据的理想方式。我建议您将传感器数据存储在.csv文件或数据库中。

相关问题