2016-12-26 11 views
0

나는 Human Activity Recognition android 응용 프로그램을 개발 중이며 앉아 있고 (정적 인) 시간과 활동 시간을 측정해야합니다. 처음에는 sharedPreferences에 긴 변수를 저장하고 매 5 초마다 (사용자 활동을 5 초마다) 5,000 씩 (밀리 초 단위로 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

당신은 당신의 서비스 전경 서비스를 확인해야합니다. 백그라운드 서비스는 리소스가 필요할 때 OS에 의해 종료됩니다.

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

이 답변 주셔서 감사로 보일 것입니다! 나는 나의 서비스를 foregorund 것으로 바꾸는 것을 definetely 고려할 것이다. Activity Recognition API에 관해서. 내 신청서는 활동적이지 않고 (정주민을위한) 비 활동을 인식하도록 고안되었으므로 사용하지 않습니다. 그래서 안드로이드 용 weka를 사용하여 내 자신의 활동 인식 시스템을 구현하고 있습니다. –