web-dev-qa-db-ja.com

場所のBroadcastReceiver

BroadcastReceiverがテキストや電話のイベントなどを監視していることは知っていますが、LocationServicesをロケーションに基づいたサービスおよびイベントとして実行できますか?

たとえば、特定のGPSポイントの近くにいて、電話が通知したとします。

15
ProNeticas

あなたが探しているのはこんな感じだと思います。 PendingIntentをパラメーターとして受け取るバージョンのLocationManager.requestLocationUpdates()があり、このインテントを使用してBroadcastReceiverを起動できます。このコードは、場所の更新で起動するカスタムブロードキャストを登録します。

_Intent intent = new Intent("UNIQUE_BROADCAST_ACTION_STRING_HERE");
LocationManager manager = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE);
long minTime;     //This should probably be fairly long
float minDistance; //This should probably be fairly big
String provider;   //GPS_PROVIDER or NETWORK_PROVIDER

PendingIntent launchIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
manager.requestLocationUpdates(provider, minTime, minDistance, launchIntent);
_

次に、BroadcastReceiverを同じインテントアクションに登録するだけで、処理のために場所の更新を受け取ります。そしてもちろん、ある時点でmanager.removeUpdates(launchIntent)を呼び出す必要があるので、そのPendingIntentを維持してください。

最終メモ:

アプリがフォアグラウンドにないときに定期的な位置更新を実装しようとしているように思われるため、この点に注意してください。アプリをバッテリーキラーとしてブランド化する必要がない限り、この機能の実装方法には細心の注意を払ってください。

位置情報サービスを停止できるようにするには、minTimeまたはminDistanceパラメータを大きくして、位置情報の更新頻度を大幅に減らす必要があります。この機能は、ユーザーが制御する設定にアタッチして、アプリがバックグラウンドで位置を追跡できないようにする必要があります。

お役に立てば幸いです。

35
Devunwired

この質問は2年以上前のものですが、これを行うための非常に簡単でバッテリー効率の良い方法があります。この概念はGeofencesと呼ばれます。あなたはそれを以下でより詳細に学ぶことができます:

http://developer.Android.com/training/location/geofencing.html

22
tasomaniac