2016-12-26 4 views
0

Я разрабатываю приложение андроида для распознавания активности человека, и я должен измерять как время сидячее (статическое), так и активное время. Сначала я старался хранить длинную переменную в 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(); 
    } 
} 


} 

ответ

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)

+0

Спасибо за ваш ответ! Я определенно подумаю о том, чтобы изменить мое обслуживание на заранее проделанную. Что касается API распознавания активности. Я не использую его, так как мое приложение будет предназначено для признания бездействия (для малоподвижных людей), а не активного. Именно поэтому я внедряю свою собственную систему распознавания активности, используя weka для android. –

Смежные вопросы