Как измерить время в Android?

Я занимаюсь разработкой приложения для Android Human Recognition, и мне нужно измерить как сидячий (статический), так и активный период. Сначала я думал сохранить длинную переменную в sharedPreferences и увеличивать ее каждые 5 секунд (я классифицирую активность пользователя каждые 5 секунд) на 5000 (5 секунд в миллисекундах).

Тем не менее, когда я запускаю свой сервис (я использую фоновый сервис для выполнения классификации и сохраняю его в SharedPreferences) и проверяю на более позднем этапе - скажем, через 2 часа, время, которое у меня есть в sharedPreferences, и фактическое время, которое имеет пройденный отличается существенно. Например, я начну свою службу в 12:00, а проверю в 14:00, и значение в общих настройках будет примерно 40 минут (при преобразовании из миллисекунд - значение /1000/60 минут).

PS: мой сервис выглядит так:

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();
    }
}


}

1 ответ

Решение

Вы должны сделать свой сервис приоритетным. Фоновые службы убиваются ОС, когда требуются ресурсы.

Intent intent = new Intent(this, MyActivityApp.class);
PendingIntent pi = PendingIntent.getActivity(this, 0, intent,   PendingIntent.FLAG_UPDATE_CURRENT);    

    NotificationCompat.Builder builder = new NotificationCompat.Builder(this);

    builder.setSmallIcon(Resource.Drawable.my_icon);
    builder.setTicker("My Activity App");
    builder.setContentIntent(pi);
    builder.setOngoing(true);
    builder.setOnlyAlertOnce(true);

    Notification notification = builder.build();   
    startForeground(SERVICE_NOTIFICATION_ID, notification);

Кроме того, вам следует изучить API распознавания активности ( https://developers.google.com/android/reference/com/google/android/gms/location/ActivityRecognitionApi).

Другие вопросы по тегам