Sleeping service with contentobserver

836 Views Asked by At

I've created a service (S) which hosts a ContentObserver (C). C keeps track of some data and logs changes made to a database (D).

S also has a timer which dumps the content of D to a file on timed intervals.

I have my service running on my phone and all seems fine for a while (a couple of hours or so). Then suddenly it stops recording changes made to the data and stops dumping to a file. I tried changing the data (provoking onChange on C) and browsing around in the phone to keep the device awake but nothing happened - service stil inactive. S is still running and when I connect to my laptop I see no errors in the log.

My guess is that the service is sleeping (gets no CPU slice). I've read a bit about a wakelock but I don't want to force the phone to be awake all the time. (). An alternative is to create a repeated alarm which carry out the work of C every T minutes (polling). I like the idea with ContentObservers more because the user can alter (especially delete) data between the updates. With a ContentObserver I will get ALL changes, not just snapshots in timed intervals.

Any ideas on how I can wake my service on a regularbasis?

Best regards Frederik

1

There are 1 best solutions below

3
On

You can use the AlarmManager to broadcast a pending intent at a set interval. If you use the RTC_WAKEUP type, it will even get sent if the device is asleep.

Intent intent = new Intent("android.intent.action.DO_SOMETHING");
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0);

AlarmManager alarmManager = (AlarmManager) getSystemService(Service.ALARM_SERVICE);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 60*60*1000, pendingIntent);

Then simply register a broadcast receiver for the intent and do what you must do. Note that broadcast receivers timeout after aprox. 10 sec, so if you got a long task, use a service