2013-07-03 18 views
6

私はほとんどユーザーの操作は必要ありませんが、Geofenceが必要なアプリを持っています。バックグラウンドサービス内でこれを完全に実行できますか?バックグラウンドサービス内でAndroidジオフェンシングを完全に実行できますか?

サービスが初めて実行されるときにアクティビティが発生します。このアクティビティはサービスを開始し、BOOT_COMPLETEDのBroadcastReceiverを登録するので、サービスは起動時に開始されます。このアクティビティが再び実行されることはほとんどありません。

このサービスは、Alarmを定期的にオフにするように設定します。これにより、IntentServiceはネットワークからロケーションのリストをダウンロードします。このIntentServiceは、これらの場所の周りにジオフェンスを設定し、場所に近づくと起動するPendingIntentsを作成します。次に、それらのPendingIntentsは別のIntentServiceに何らかのアクションを起こさせます。

これはすべて、バックグラウンドで実行する必要があります。インストール後初めてアクティビティを開始する以外は、ユーザーの操作は必要ありません。したがって、アクティビティはLocationClientまたはロケーションサービスと対話しません。

私は実際にproximityAlertsでこれを設定しましたが、バッテリ寿命の理由から新しいGeofencing APIに移行したいと考えています。しかし、私は、サービス内からLocationClientを使用することにはいくつか問題があると聞いています。具体的には、私が聞いた(申し訳ありませんが、参照は、単に主張を伝聞しない):

  • 場所クライアントは、バックグラウンドスレッドから呼び出された場合
  • エラーハンドリングするためのUIの可用性に依存している、LocationClient.connectは()それことを前提としてい私たちがこのメソッドをバックグラウンドスレッドで実行しているサービスから呼び出すと、メインのUIスレッド(またはイベントルーパを持つ他のスレッド)から呼び出されます。

調査したところ、私は見ることができませんそれがなぜこのようになるのか、なぜそれが私のやりたいことをやめさせるのか。近接警告のためのほぼドロップインの代替となることを期待していた。

誰かがここに物事を投げ捨てることはできますか?

答えて

2

最高のことは、試してみることです。あなたの戦略は健全なようです。

when called from background thread, LocationClient.connect() assumes that it is called from main ui thread (or other thread with event looper), so connection callback is never called, if we call this method from service running in background thread. 

私はこれが本当ではないことを知っています。アクティビティから開始されたサービスがあり、接続コールバックが呼び出されます。

近接アラートについてはわかりません。私はGeoFencesをリストするAPIを見つけることができないようです。私は自分のデータベース(sqlite)と実際のフェンスが同期しなくなるかもしれないと心配しています。それは私の意見では設計上の欠陥です。

LocationClientにUIが必要な理由は、端末にGoogle Playサービスがインストールされていない可能性があるためです。 Googleは狡猾で複雑な仕組みを使い、アプリにダウンロードを促すことができます。私の意見では全体が恐ろしくひどいです。そのすべての「what-if what-if」プログラミング。

(彼らはGoogle IO 2013のためにたくさんの物を急いでいました。そのすべてが十分に文書化されているわけではありません。

+0

GeofenceをリストするAPIが見つかりませんでした。また、Geofenceもリストしたいと思っています。私はまた、私のsqlite dbと登録されたフェンスの実際のリストが同期していないことを心配しています... –

関連する問題