マーリンの答えに加えて(表示されたときにメモ帳でこのロットを入力していました)-同意します。私の提案は:
同様の問題に直面して、私は最善の方法は、サービスを使用してGPS全体をメインアクティビティから切り離すことであると判断しました。
これは、requestsLocationUpdates()
とremoveLocationUpdates()
を実行し、を実装するサービスがあることを意味しLocationListener
ます。このサービスは、メインアクティビティがIBinder
インターフェイスを使用して呼び出すことができるメソッドを提供します。また、BroadcastReceiver
これらのメッセージをリッスンするためにを実装するアクティビティにブロードキャストを送信します。
したがって、主なアクティビティで呼び出すことができるサービスメソッドの1つは、(たとえば)
mLocnServ.startGPS(int timeout, float requiredAccuracy, int minUpdatePeriod, int minResendDistance)
ここmLocnServ
で、はサービスによって公開されるバインダーインターフェイスです。
最後の2つの引数は、サービスのrequestLocationUpdatesに引数として渡す引数です。(個人的には、GPSが呼び出されるまで常に実行されていることがわかる限り、GPSがオフになったときにこれらが何の違いももたらさないと思いますremoveUpdates()
)。とにかく、最初の引数(タイムアウト)は、必要な精度の修正を待つ準備ができている時間である必要があります(引数2)。
したがって、サービスでは、タイマーとしてRunnableが必要になります。タイマーがタイムアウトすると、タイプTIMED_OUT
(たとえば)のブロードキャストを送信し、GPSを停止するためにremoveUpdatesを送信します。onLocationChangedで、必要な精度に対して取得した場所をテストできます。十分な場合は、タイプGOT_A_FIX
(たとえば)のブロードキャストを送信し、その場所(緯度/経度と精度)をブロードキャストの追加情報として渡してから、removeUpdatesを使用してGPSを停止します。 。(TIMED_OUT
およびGOT_A_FIX
は、ブロードキャストメッセージタイプを区別するために作成できる列挙型の単なる例の名前です)
主なアクティビティは、BroadcastReceiver onReceive()で何を実行するか、つまり、TIMED_OUT
ブロードキャストを取得した場合に再試行するかどうか、またはメッセージから取得したデータをどのように処理するかを決定できGOT_A_FIX
ます。
mLocnServ.stopGPS
サービスが何をしていてもGPSを閉じることができるように、おそらくバインダーにもが必要です。