Я разрабатываю приложение андроида для распознавания активности человека, и я должен измерять как время сидячее (статическое), так и активное время. Сначала я старался хранить длинную переменную в sharedPreferences и увеличивать ее каждые 5 секунд (я классифицирую активность пользователя каждые 5 секунд) на 5000 (5 секунд в миллисекундах). Тем не менее, прямо сейчас, когда я запускаю свою службу (я использую фоновый сервис для выполнения класификации и сохраняю его в SharedPreferences) и проверяю позже - скажите через 2 часа, время, которое у меня есть в sharedPreferences и фактическое прошлое значительно отличается. Например, я начну свой сервис в 12 часов и проверю в 2 часа дня, а значение в общих предпочтениях будет примерно 40 минут (при условии, что во время паузы в миллисекундах - значение/1000/60 минут). Я был бы признателен за любые идеи о том, как измерять время по вышеуказанному пути. Заранее спасибо!Как измерить время в Android?
P.S .: Моя служба выглядит так:
public class MyService extends Service implements SensorEventListener {
public static final String COUNTER_KEY = "counterKey3";
public int counter = 0;
private static final long WINDOW_LENGTH = 5000;
private long windowBegTime = -1;
private SensorManager mSensorManager;
private Sensor accSensor;
private ArrayList<Double> xValues = new ArrayList<>();
private ArrayList<Double> yValues = new ArrayList<>();
private ArrayList<Double> zValues = new ArrayList<>();
private SharedPreferences mSharedPreferences;
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
super.onStartCommand(intent, flags, startId);
mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
accSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
mSensorManager.registerListener(this, accSensor, SensorManager.SENSOR_DELAY_GAME);
return START_STICKY;
}
@Override
public void onCreate() {
super.onCreate();
mSharedPreferences = getSharedPreferences(getPackageName(), MODE_PRIVATE);
counter = mSharedPreferences.getInt(COUNTER_KEY, 0);
}
@Override
public void onSensorChanged(SensorEvent sensorEvent) {
xValues.add((double) sensorEvent.values[0]);
yValues.add((double) sensorEvent.values[1]);
zValues.add((double) sensorEvent.values[2]);
if (SystemClock.elapsedRealtime() - windowBegTime > WINDOW_LENGTH) {
if (windowBegTime > 0) {
mSharedPreferences.edit().putInt(COUNTER_KEY, mSharedPreferences.getInt(COUNTER_KEY, 0) + 5).apply();
Log.i("MyService", "WindowTimeIssue! " + mSharedPreferences.getInt(COUNTER_KEY, 0));
// DETECT ACTIVITY - store it in a db
}
windowBegTime = SystemClock.elapsedRealtime();
}
}
}
Спасибо за ваш ответ! Я определенно подумаю о том, чтобы изменить мое обслуживание на заранее проделанную. Что касается API распознавания активности. Я не использую его, так как мое приложение будет предназначено для признания бездействия (для малоподвижных людей), а не активного. Именно поэтому я внедряю свою собственную систему распознавания активности, используя weka для android. –