私のアプリケーションは、定期的な位置情報の更新とアクティビティ認識の検出をバックグラウンドで実行します。
Google Play Services API を使用してそれを行っています。
たとえば、場所の更新に登録するには、更新を受信する保留中の意図を提供します。
mLocationClient.requestLocationUpdates(mLocationRequest, pendingInent);
場所の更新への登録を解除するには、次のことを行っています。
mLocationClient.removeLocationUpdates(pendingInent);
それは素晴らしいことです。
しかし、アプリケーションのコンポーネントへの Intent を保持している pendingIntent が現在 Google Play サービスの前に登録されており、位置情報の更新を受信しているかどうかを確認するにはどうすればよいですか?
これをチェックする API がないことに気付きました。pendingIntent の存在をチェックするアプローチは、Google Play サービスに対する API では機能しないようremoveLocationUpdates()
です。メソッドを呼び出した後でも保留中のインテントが存在したままです。
現在登録されているかどうかを示す状態を(共有設定に)保存できることはわかっていますが、それは正しい解決策ではなく、Google PlayプロセスがダウンしてpendingIntentを失った可能性があるため、「バグ」になりますが、私のプロセスは、場所の更新が「アクティブ」であるとまだ考えています..
アクティビティ認識の更新についても、まったく同じ問題が存在します。
明確にするために、私がやりたいことは、アプリが現在バックグラウンドでデータを収集しているかどうかを知る機能をアプリケーションのユーザーに提供し、それらを切り替える方法を提供することだけです。したがって、信頼できる方法でそれを行う他の方法があれば、それも答えとして除外します
信頼できる方法 = 現在保留中のインテントが実際に Google Play サービスに登録されているかどうかを知る...
- プロセスがシャウトダウンしたときに更新イベントを受信できる必要があるため、使用
LocationListener
はオプションではありません-PendingIntent
コールバックを使用してのみ可能です..
前もって感謝します。
アップデート
これは、ロケーションの更新を登録および登録解除するために提供する pendintIntent です。
Intent locationUpdatesIntent = new Intent(context, LocationUpdatesIntentService.class);
PendingIntent pendingInent = PendingIntent.getService(context, 0, locationUpdatesIntent, PendingIntent.FLAG_UPDATE_CURRENT);
これは、登録されているかどうかを(失敗して)確認しようとしている方法です。
Intent locationUpdatesIntent = new Intent(context, LocationUpdatesIntentService.class);
PendingIntent pendingInent = PendingIntent.getService(context, 0, locationUpdatesIntent, PendingIntent.FLAG_NO_CREATE);
boolean isLocationUpdatesEnabled = (pendingIntent != null);
isLocationUpdatesEnabled
呼び出した後、真のイベントを返しますremoveLocationUpdates()