/**************************************************************************************************
* Copyright (C) 2010 Sense Observation Systems, Rotterdam, the Netherlands. All rights reserved. *
*************************************************************************************************/
package nl.sense_os.service.states;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.IBinder;
/**
* Helper class to build a state sensor that periodically analyzes data from certain sensors on the
* phone. Implementing classes should put the analysis in {@link #updateState()}.
*
* @author Steven Mulder <steven@sense-os.nl>
*/
public abstract class AbstractStateMonitor extends Service {
private PendingIntent operation;
private final int REQCODE = 0x057A7E;
/**
* Receiver for update alarms.
*/
private final BroadcastReceiver updateReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// TODO use intent service to do the work
updateState();
}
};
@Override
public IBinder onBind(Intent arg0) {
// binding not possible
return null;
}
protected abstract void updateState();
protected void startMonitoring(String action, long interval) {
// register receiver
registerReceiver(updateReceiver, new IntentFilter(action));
// start alarms
Intent alarm = new Intent(action);
operation = PendingIntent.getBroadcast(this, REQCODE, alarm, 0);
AlarmManager mgr = (AlarmManager) getSystemService(ALARM_SERVICE);
mgr.cancel(operation);
mgr.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), interval, operation);
}
protected void stopMonitoring() {
// unregister receiver
try {
unregisterReceiver(updateReceiver);
} catch (IllegalArgumentException e) {
// do nothing
}
// stop update alarms
AlarmManager mgr = (AlarmManager) getSystemService(ALARM_SERVICE);
mgr.cancel(operation);
}
}