2

場所のコレクションを持つSqliteデータベースがあります。このデータベースへのアクセスには、コンテンツプロバイダーが使用されます。

次に、アクティビティ内の場所のリストをクリックして、データベース内の場所にアクティブまたは非アクティブのフラグが付けられます。

次に、アクティブな場所をリッスンし、場所に到達したときに何かを実行するサービスが実行されます。

私の質問は、サービスを運用するための最良の方法は何でしょうか。

データの変更時に自動的に更新されるアクティブな場所のカーソルを監視するようにします。場所のリストを使用して実行する必要があるすべてのアクティビティは、場所をアクティブに設定してから、サービスインテントを呼び出して実行されていることを確認することです。

これの利点は、私が見ているように、データベースで何が起こってもサービスが最新であるということです。しかし、カーソルを開いたままにして、場所が変わるたびにカーソルを移動するのが効率的かどうかはわかりません。

もう1つの方法は、アクティビティでデータベース内の場所をアクティブに設定してから、サービスにバインドし、場所データを送信してリッスンすることです。次に、サービスはこれをlistarrayに格納し、場所が変更されるたびにリストをトラバースして、場所に到達したかどうかを確認します。

これの欠点は、場所の修正ごとにサービスをバインドし、場所を変更する必要があることです。利点は、カーソルが開いておらず、位置がの小さなリスト配列のみが格納されることです。

では、サービスにカーソルを置くか、サービスにバインドするのでしょうか。それとも私が行方不明になっているさらに良い方法はありますか?

4

1 に答える 1

1

これは、効率とコードの複雑さのバランスです。

プロバイダーにオブザーバーを登録し、プロバイダーが変更されるたびにアクティブな場所のリストを更新し、現在の場所に対してリストをスキャンします。オブザーバーを Cursor に関連付ける必要はありませんが、ContentObserver.onChange() が呼び出されたときにプロバイダーを再クエリする必要があります。

この作業はバックグラウンドで行うことを忘れないでください。IntentService を使用するか、HandlerThread を実行する独自のサービスを記述します。AsyncTask と同じようにアクティビティ ライフサイクル イベントの影響を受けないため、IntentService または Service を使用することを好みます。

于 2012-12-17T21:32:49.637 に答える