私のアプリは、ユーザー定義の間隔で鳴る RTC_WAKEUP アラームをスケジュールします。起動したら、大まかな更新のために位置情報サービスに登録し (都市レベルで十分です)、単一の位置レポートを最大 60 秒待機し、リスナーの登録を解除してから、位置固有の Web クエリを作成し、さまざまな操作を行います。返された情報を含むもの。
私は、場所の修正に使用できる少なくともワイヤレス ネットワークが常に存在する環境でテストを行ってきました。この手順はほぼ常に正常に機能しますが、ログによると、アプリが位置情報レポートの待機中にタイムアウトすることがあります。これは、アラームがデバイスをスリープ状態から復帰させ、デバイスがモバイル ネットワーク接続が不安定な建物の奥深くにある場合にのみ発生するようです。このような状況では、ワイヤレス ネットワークが (私が思うに) 位置情報の唯一の可能なソースであるため、(a) アラームによってデバイスがスリープ状態から復帰したとき (誰かが接続?)、または (b) 60 秒では十分な長さではありません。
これらのいずれかが真実であるかどうかを確認できる人はいますか? (a) の場合、「ワイヤレス ネットワークに再接続してから応答してください」というコマンドを発行できますか?
タイムアウト間隔をいじることはできますが、それで問題が解決したように見えても、何が起こっているのかを理解するまで、根本的な原因に本当に対処したとは言えません...
手順に関するいくつかの核心的な詳細: アラームを受信すると、アプリは位置情報サービスIntentService
に を登録するLocationClient
を開始します。次に、wait()
あきらめて 60 秒後に失敗を返すループに入ります。次に、クライアントは から を登録しLocationListener
ますonConnected()
。そのリスナーがレポートを受信するLocation
とnotifyAll()
、待機中のスレッドを保存します。これはどのようにLocationRequest
見えるかです (レポートは 1 つだけ必要ですが、できるだけ早くしたいです):
LocationRequest request = LocationRequest.create();
request.setPriority(LocationRequest.PRIORITY_LOW_POWER);
request.setInterval(0);
request.setFastestInterval(0);
request.setNumUpdates(1);