1

場所の有無にかかわらず動作できる Android アプリケーションがあります。アクティビティでこのケースを処理するのは簡単です: ロケーション リスナーを設定し、進行状況ダイアログで待機しますが、ユーザーが待機を中止できるようにします (ロケーション プロバイダーが無効になっている場合、特別なエラーは発生しません。場所を返します...いいです)。

ただし、場所を必要とするサービスもあります。サービスはアクティビティの前に実行される可能性があるため、アクティビティに依存して場所を取得することはできません (または取得しない)。

問題は、このケースをサービスでどのように処理するかです。場所を待つことはできますが、ユーザーの中止に頼ることはできないため、待機を停止するタイミングをどのように知ることができ、場所が利用できないと想定できますか? 私は次のようなことができるようです、

  1. ロケーションリスナーを設定し、更新を待ち、アクション「更新」で3分後に同じサービスをスケジュールするアクション「ロケーションの取得」でサービスをスケジュールします
  2. サービス アクション「更新」で、最後に確認された場所を取得し、それで満足します。それは得られたか、得られなかったかのどちらかです。null の場合は、場所がなく、できる限りのことをしたことを示しています。

これは機能するようですが、onHandleIntent() の後にインテント サービスが停止すると、on location changed イベントが受信されないため、単純なインテント サービスを使用できなくなったため、複雑になっています (私は推測します)。

とにかく複雑なので、もっと簡単な方法はないかと考えています。

4

1 に答える 1

0

UpdateService - 実際に更新作業を行うインテント サービス。これは getLastKnownLocation() を呼び出して場所を取得するだけです。

LocationService - 位置情報の更新を登録し、タイマーを 2 分で起動するように設定する通常のサービス。位置情報の更新を取得するか、タイマーがオフになります。位置情報が更新されたら、タイマーをキャンセルします。どちらの場合も、位置情報更新の登録を解除し、UpdateService を開始して実際の作業を行ってから停止します。

「バックグラウンド」プロセスとなる繰り返しアラームとして LocationService をスケジュールします。

アクティビティは物事を異なる方法で処理します。場所の更新を要求し、ダイアログを表示します。場所の更新を取得するか、ユーザーがダイアログをキャンセルします。いずれにせよ、位置更新の登録を解除してから、UpdateService を直接開始します (LocationService ではなく、ここで既に位置を取得しています)。

于 2010-12-24T20:31:52.457 に答える