plusone

30. Juni 2011

GPS-Listener Akkusparend nutzen #Update

Guten Abend allerseits,

bei meiner ersten APP WIFIosGeoP die auf dem Androidmarkt registriert ist und welche ich bald frei gebe, habe ich mich mit dem Thema GPS auseinander gesetzt.
Dabei ist mir aufgefallen, dass die Standardmethode requestLocationUpdates(String, long, float, LocationListener) für meinen Geschmack zu Gunste des Akkuverbrauchs arbeitet. Sprich in 5h hatte ich meine 1,5 Ah verbraucht! Und das ohne zu telefonieren oder surfen, geschweige den spielen auf dem Gerät.

Die Zeitangabe ist für eine interne Berechnung, leider kann ich nicht genau sagen welche.
Die Strecke ist das Entscheidende! Bewegt ihr euch weiter als diese Angabe wird das Event onLocationChanged(Location) ausgelöst. Da aber die Genauigkeit des Signals auch mal 180 Meter betragen kann, sind angaben beim requestLocationUpdates.. von 20 Meter für die Katz.
Hier ist eine interne Abfrage getAccurary() vonnöten.


So wir wollen aber dennoch eine Kontinuierliche Abfrage und auch Location bekommen!
Hierbei hilft uns ein Thread mit Schleife oder die elegantere Möglichkeit Timer und TimerTask. Ich hab mich für das letztere entschieden.

So als erster der Timer:
Timer myTimer = new Timer("MeinTimerName");
myTimer.schedule(new MeinTimerTask(), 1000, 60000);

Erklärung:
Wartet 1000 Millisekunden, dann wird der MeinTimerTask gestartet und dieser wird anschließen alle 60000 Millisekunden, also jede Minute ausgeführt.

Der TimerTask:

public class MeinTimerTask extends Timertask {

@Override
public void run(){
MeineHauptKlasse.meinHandlerFuerGPS.sendEmptyMessage(0);
}
}

Erklärung:
Die run()-Methode wird kontinuierlich ausgeführt. Diese stößt den Handler in der MeineHauptKlasse an. Handler sind notwendig um threadübergreifend mit der GUI zu arbeiten! Statischer Zugriff! Bitte ändern, wenn ihr mit mehreren Instanzen arbeitet!

public class MeineHauptKlasse {

private Handler meinHandlerFuerGPS = new Handler(){

@Override
public void handleMessage(Message mesg){
meinLocationManager.requestLocationUpdate(LocationManager.GPS_PROVIDER, 0L, 0f, meinGPSListener);
}
};

private MeinGPSListener meinGPSListener= new MeinGPSListener ();
private LocationManager meinLocationManager ;

public MeineHauptKlasse(Context context){
meinLocationManager = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE);

}

class MeinGPSListener extends LocationListener {


@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
//Wenn nötig
}

@Override
public void onProviderEnabled(String provider) {
//Wenn nötig
}

@Override
public void onProviderDisabled(String provider) {
//Wenn nötig
}

@Override
public void onLocationChanged(Location location) {
//verarbeiten und anschließend:
meinLocationManager.removeUpdates(meinGPSListener);
}
}
}

Erklärung:
Mit der Instanzierung des von MeinGPSListener fängt die Klasse an! Dann kommt erst der Konstruktor! Ihr könnt diese Klasse als Activity umschreiben, dann wird aus dem Konstruktor ein onCreate(..) und der Parameter context wird überflüssig!

Mit meinHandlerFuerGPS verarbeiten wir die Nachricht, dass wir nun dran sind. (send - handle)
Wir fügen meinLocationManager unsere Instanz des LocationListener mit dem GPS_PROVIDER. GPS vorher anmachen bzw. anmachen lassen! Dafür eigenen sich die Methoden onProviderDisabled.. und onProviderEnabled.. recht gut. Das passende Intent könnt ihr damit anzeigen lassen: new Intent(Settings.ACTION_SECURITY_SETTINGS);

BTT - Da wir eine Strecke von 0 Meter angegeben haben, kriegen wir nun im Sekundentakt das Event onLocationChange(Location) ausgelöst. Verarbeitet die Location und entfernt den Listener wieder s.o.!

Damit hat euer Akku wieder Ruhe, jedenfalls für eine Minute. Bei einer Zeitangabe von 15 Minuten, hält der Akku ohne weitere Belastungen locker das WE durch.


Tipps für Modifikation:
Stichwörter PowerManager, PARTIAL_WAKE_LOCK und WakeLock. Das acquire() muss in die run()-Methode vor dem sendEmptyMessage(0), dann Läuft eure APP weiter, auch wenn das Handy im "StandBy" ist.


So hoffe es ist hilfreich für euch und ihr gebt dem Akku auch eine Chance :)
Imports habe ich ausgelassen, Eclipse sollte euch mit Strg+O helfen können.
Viel Spaß beim Ausprobieren!

regards


#Update (03. Juli 2001) - - - - - - - - - - - - - - - - - -
WIFIosGeoP ist seit Freitag Abend im Market erhältlich.
Rechts im Projektbuch könnt ihr den Link mit per QR-Code mit eurem Handy einscannen.

Bei Problemen, Anregungen oder Wünschen könnt ihr hier posten oder mir eine Mail schicken.

regards


Keine Kommentare:

Kommentar veröffentlichen