Google Play Dienste: wie zu überprüfen, ob die derzeit "aktiven" pending intent-callback registriert, um Standort-updates/Aktivität Anerkennung?
meine Anwendung führen Sie regelmäßige Standort-updates und-Aktivität-Anerkennung-Erkennung im hintergrund.
Ich mache das mit den Google Play Services API:
zum Beispiel - zu registrieren, um Standort-updates, die ich pending intent zu erhalten update:
mLocationClient.requestLocationUpdates(mLocationRequest, pendingInent);
um die Registrierung zu-Standort-update, ich mache Folgendes:
mLocationClient.removeLocationUpdates(pendingInent);
das ist schön, und funktioniert Super.
aber wie finde ich heraus, ob es aktuell einen pendingIntent holding Absicht, um meine Anwendung Komponente ist bereits angemeldet vor der Google play-Dienste zu erhalten, location updates oder nicht?
Ich bemerkt, dass es keine API, um diese zu überprüfen, und die Ansatz zu prüfen, pendingIntent Existenz scheint nicht zu funktionieren für die API gegen die google play-Dienste - die ausstehende Vorsatz bleibt vorhanden, auch nachdem ich den Anruf removeLocationUpdates()
Methode.
Ich weiß, ich kann Zustand speichern (shared preferences), die angibt, ob ich nun registriert bin oder nicht, aber es ist nicht die richtige Lösung, und "buggy", weil es passieren kann, dass google play-Verfahren ging, verloren die pendingIntent, aber mein Prozess immer noch denken, dass die location-updates sind "aktive"..
gleiche problem genau besteht für die Tätigkeit Anerkennung updates.
Nur klar machen, alles was ich tun möchte, ist zu den Benutzern meiner Anwendung Fähigkeit zu wissen, wenn meine app ist derzeit die Erhebung von Daten im hintergrund läuft oder nicht, und Ihnen eine Möglichkeit zum Umschalten zwischen. Also, wenn es andere Wege, das zu tun, in zuverlässiger Weise - ich werde außer es als Antwort auch
zuverlässige Art = zu wissen, ob derzeit die angemeldete Absicht, wirklich Flagge aus der google-play-services...
- mit
LocationListener
ist keine option für mich, denn ich muss in der Lage sein, um updates zu erhalten-Ereignis aus, wenn mein Prozess ist Schreien nach unten - was ist möglich nur mitPendingIntent
Rückruf..
Vielen Dank im Voraus.
UPDATE
dies ist die pendintIntent, die ich zum registrieren und aufheben der Registrierung, um den aktuellen Standort:
Intent locationUpdatesIntent = new Intent(context, LocationUpdatesIntentService.class);
PendingIntent pendingInent = PendingIntent.getService(context, 0, locationUpdatesIntent, PendingIntent.FLAG_UPDATE_CURRENT);
und das ist wie ich bin versucht zu überprüfen (erfolglos) wenn Sie registriert sind oder nicht:
Intent locationUpdatesIntent = new Intent(context, LocationUpdatesIntentService.class);
PendingIntent pendingInent = PendingIntent.getService(context, 0, locationUpdatesIntent, PendingIntent.FLAG_NO_CREATE);
boolean isLocationUpdatesEnabled = (pendingIntent != null);
isLocationUpdatesEnabled
gibt true zurück, Fall, nachdem ich call removeLocationUpdates()
com.google.android.gms.location.LocationClient
?ja, warum?
Laut der docs, LocationClient ist veraltet und Sie sollten mit LocationServices statt. Siehe hier: developer.android.com/reference/com/google/android/gms/location/...
Nicht beantworten Ihre Frage, aber nur ein heads-up.
Kann man den code zum erstellen
PendingIntent
? Hauptsächlich daran interessiert, dass die flags übergeben, um es.InformationsquelleAutor Tal Kanel | 2014-08-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Folgenden sind die Szenarien, wenn ein
PendingIntent
entfernt ist:PendingIntent
entfernt werden können, die explizit durch Aufruf vonPendingIntent.cancel
nur durch die Anwendung, die es erstellt. Aus der docs:PendingIntent
wenn inaktiv, d.h. nicht von einer anderen Anwendung entfernt wird, um das system, wenn die Anwendung beendet wird.PendingIntent
, wenn aktiv, D. H. von einer anderen Anwendung entfernt wird, um das system nur, wenn das application-Paket deinstalliert wird.Daher ruft
removeLocationUpdates
zeigt das system, dass die Google Location services, nicht mehr referenziert diePendingIntent
. Es nicht aus dem system entfernen. So haben Sie zu rufencancel
aufPendingIntent
um es zu entfernen, das ist absolut in Ordnung.Zusätzliche info aus der docs:
gerade überprüft es. sieht toll aus! als Sie sagte, der Aufruf von cancel() scheint, den job zu erledigen! ich danke Ihnen sehr für Ihre Antwort!! Ich war schon ein bisschen skeptisch, es ist wirklich die Lösung, dass.. toll etwas neues zu lernen!
InformationsquelleAutor Manish Mulimani
Den Benutzer zu informieren, die app sammelt im hintergrund Daten mit einer benutzerdefinierten Meldung in der Statusleiste. Die Benachrichtigung der Benutzer, wo Sie können anmutig und stoppen Sie die Aufnahme.
Beispiel unten ist Teil des Dienstes. Start und stop gesteuert durch einen boolean übergeben, mit der Absicht verwendet, um den service zu starten. Wenn Ihre app wird der Dienst angehalten ist noch die Aufnahme im hintergrund Daten und die Benachrichtigung können die Benutzer wieder auf Ihre app ordnungsgemäß herunterzufahren, die hintergrund-Daten-Aufnahme.
Bei der Aufnahme startForeground anzuzeigen status bar notification. Wenn keine Aufnahme stopForeground(true) zum entfernen der Benachrichtigung.
Ich dachte, ich hätte alles abgedeckt Fähigkeit zu wissen, wenn die app ist die Erfassung von Daten (Benachrichtigung) mit ein, sofern es sich um toggle (Meldung Absicht). Nicht das sammeln von Daten keine Benachrichtigung.
Ich danke Ihnen sehr für Ihre Antwort. Neben der Tatsache, dass ich nicht wollen, um zu zeigen dem Benutzer diese undissmisable Benachrichtigung, dieser Ansatz funktioniert nicht für die Anmeldung zum Standort-updates mit pendingIntent Rückruf, denn pendingIntent noch registriert, wenn mein Dienst, und sogar meine gesamte Prozess wird gestoppt
Leider konnte ich nicht helfen. Ihr werde für die angemeldete Absicht, damit Sie Ihren Prozess geweckt werden kann durch die Lage. Das ist ein guter Grund. Ich bin einfach nur brain-storming. Sie konnte putextra eine fortlaufende Nummer in Ihre offene Absicht. Speichern lastnumberreceived und lastnumbersent in statischen sequentielle Variablen und den Unterschied zwischen den beiden, um festzustellen, ob die Absichten verloren.
Vielen Dank für diese Ideen! Ich weiß es zu Schätzen .. ich bin der Hoffnung, dass es mehr trivial und zuverlässige/offizielle straight forward Lösung ohne workaround-tricks, und hoffe, dass dieses Kopfgeld bringt diese Lösung aus
InformationsquelleAutor danny117