2

私のシナリオは、サービスが定期的に情報 (ユーザーの場所など) を取得し、それをサーバーに報告し、場所が X の場所と一致する場合にプッシュ通知を受信するようにしたいと考えています。

アプリケーションが実行されているかどうかに関係なく、位置情報を定期的に取得するための最良のメカニズムについて、アドバイスを求めたいと思います。以下は、私が考えたオプションと、それぞれの背景情報です。

標準 Android サービスの作成

私が最初に考えたのは、位置情報の更新を取得し、位置情報を受信するとサーバーに送信する GoogleAPIClient を初期化する STICKY サービスを作成することでした。このアプローチの問題点は、位置情報を定期的に取得する必要があることです。そのため、ロケーション スキャンを実行していなくても、サービスは常に実行されます。また、サービス内で頻繁に場所をポーリングする最良の方法は何でしょうか?

IntentService でアラームを作成する

私が考えた 2 番目のオプションは、Alarm Manager を起動して、(GoogleAPIClient を介して) 位置情報の更新を開始する IntentService を開始することでした。場所が取得されたらサーバーに送信し、場所の更新を閉じます。これにより、位置情報の更新を定期的に開始/停止するという問題が解決されます。ただし、待機せずに IntentService 内で GoogleAPIClient に接続することはあまりうまくいきませんでした。これが最も効率的な方法だとは思いません。

GcmTaskService の作成

これには AlarmManager の多くの利点があり、電話機がメンテナンス モードのときにのみサービスを起動するため、居眠りモードの点でより効率的であるように思われるため、良い解決策のように思えました。ただし、GoogleAPIClient に接続して何らかの待機なしで位置情報を取得する IntentService と同じ問題があります。

私はこれについてうさぎの穴に行きすぎている可能性があり、私が見逃している明らかな何かがあるかもしれないので、アドバイスをいただければ幸いです.

4

2 に答える 2

1

私は同じ問題を抱えていました。私は最初のアプローチ (粘着性のあるサービス) に行きましたが、すべてうまくいきました。ただし、サービスが常に実行されていて、ユーザーに表示されているという事実は気に入りませんでした。docsに従ってバックグラウンド作業を実行する好ましい方法であるため、JobScheduler API を使用することにしたのはそのためです。

アプリが API>=21 をターゲットにしている場合、JobScheduler が最適です。古いバージョンのプラットフォームをサポートしたい場合は、最近導入されたFirebase JobDispatcherライブラリを使用する必要がありますが、残念ながらドキュメントが不足しています。

すべてがGoogle I/O 2016 プレゼンテーションで説明されていますそれを見てください。

于 2016-08-22T21:41:22.897 に答える
0

更新をリクエストする場合、最大頻度をリクエストできます。サービスを使用して、必要なポーリング間隔に等しい最大頻度を設定するだけです。AlarmManager は必要ありません。

于 2016-08-22T19:38:38.653 に答える