From b3798713943f924a095664f0267922d888ddee79 Mon Sep 17 00:00:00 2001 From: Georg Lukas Date: Fri, 11 Nov 2011 15:19:39 +0100 Subject: [PATCH] fixed position: use AlarmManager for reliable wakeups --- src/location/FixedPosition.scala | 39 ++++++++++++++++++++++++++++---- 1 file changed, 35 insertions(+), 4 deletions(-) diff --git a/src/location/FixedPosition.scala b/src/location/FixedPosition.scala index 66a4800..30b9f41 100644 --- a/src/location/FixedPosition.scala +++ b/src/location/FixedPosition.scala @@ -1,31 +1,61 @@ package org.aprsdroid.app +import _root_.android.app.AlarmManager +import _root_.android.app.PendingIntent +import _root_.android.content.BroadcastReceiver import _root_.android.content.Context +import _root_.android.content.Intent +import _root_.android.content.IntentFilter import _root_.android.location.Location import _root_.android.os.{Bundle, Handler} import _root_.android.util.Log class FixedPosition(service : AprsService, prefs : PrefsWrapper) extends LocationSource { val TAG = "APRSdroid.FixedPosition" - val periodicPoster = new Runnable() { override def run() { postPosition(); postRefresh(); } } + val ALARM_ACTION = "org.aprsdroid.app.FixedPosition.ALARM" + + val intent = new Intent(ALARM_ACTION) + val pendingIntent = PendingIntent.getBroadcast(service, 0, intent, + PendingIntent.FLAG_UPDATE_CURRENT) + + // get called on alarm + val receiver = new BroadcastReceiver() { + override def onReceive(ctx : Context, i : Intent) { + Log.d(TAG, "onReceive: " + i) + postPosition() + postRefresh() + } + } + + val manager = service.getSystemService(Context.ALARM_SERVICE).asInstanceOf[AlarmManager] + + var alreadyRunning = false override def start(singleShot : Boolean) = { - stop() + if (alreadyRunning) + stop() + alreadyRunning = true + + service.registerReceiver(receiver, new IntentFilter(ALARM_ACTION)) postPosition() if (!singleShot) postRefresh() + service.getString(R.string.p_source_manual) } override def stop() { - service.handler.removeCallbacks(periodicPoster) + manager.cancel(pendingIntent) + service.unregisterReceiver(receiver) } def postRefresh() { // get update interval val upd_int = prefs.getStringInt("interval", 10) - service.handler.postDelayed(periodicPoster, upd_int*60*1000) + Log.d(TAG, "postRefresh(): " + upd_int + " min") + manager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + upd_int*60*1000, + pendingIntent) } def postPosition() { @@ -34,4 +64,5 @@ class FixedPosition(service : AprsService, prefs : PrefsWrapper) extends Locatio location.setLongitude(prefs.getStringFloat("manual_lon", 0)) service.postLocation(location) } + }