1

わかりましたので、前もって私は Android が初めてだと言います。私はいくつかの小さなプロジェクトを作成し、いくつかのことで遊んで、たくさんの読書をしました。だからここに私が達成しようとしているタスクがあります:

Wi-Fi ネットワークを介して他の Android デバイスと情報を送受信できる、電話のフォアグラウンドで実行されるリモート サービスがあります。このサービスを使用するために構築されたスマートフォンの APK には、複数の SQLite DB が含まれています。これらの APK がコンテンツ プロバイダーをサービスに登録して、サービスが受信したデータをどこに置くかを常に認識できるようにしたい (私はこのタスクを完了しました)。データが入ってきたら、それがどこに属しているかを特定し、適切な DB に配置します (ここでは問題ありません)。では、新しいデータが受信されたことを正しいアクティビティに通知する最善の方法は何でしょうか。自分のサービスが呼び出すブロードキャスト レシーバーを登録する必要がありますか? APK が OS によって強制終了された場合、ブロードキャスト レシーバーは機能しますか? 正しいアクティビティが読み込まれたら、コンテンツ オブザーバーを使用して新しいデータを表示しますか? IntentServices を使用する理由

質問が多くてすみません。私が言ったように、私は速く学んでいますが、Android の SKD は大規模であり、非常に多くの優れた機能があります。ベスト プラクティスに基づいて物事を正しく考え、これを非常に簡単に保守および拡張できるようにしたいと考えています。私が得ることができる助けやアドバイスをありがとう。

4

1 に答える 1

4

現在のアクティビティが、読み取り元の ContentProvider でデータが変更されたことを知るための最良の方法は何かを尋ねている場合、答えは ContentObserver です。

例として、Activity と ContentProvider のセットがあるとします。アクティビティ A は、コンテンツ プロバイダー A からのアイテムのリスト ビューであり、そのリスト ビューは、ある種の CursorAdapter を介して取り込まれます。ContentProviders CONTENT_URI に対してクエリを実行する場合は常に、カーソルは ContentObserver を介して CONTENT_URI の変更を自動的に監視する必要があります。

これが機能する理由は、ContentProvider にあるためです。

  1. クエリ メソッドは、クエリされた URI に対してカーソルで setNotificationUri を呼び出します。
  2. 挿入/更新/削除メソッドで変更が発生するたびに、URI で notifyChange を呼び出します。

ContentProvider に関連付けられていないサービスで変更できる追加データがある場合は、データを渡す方法についていくつかの選択肢があります。アクティビティがサービスと同じ APK にある場合は、ある種の静的変数、アプリケーション コンテキスト、またはその他のカスタム形式の通信を使用できます。ここでは、同じ VM で実行しているため、メソッドはかなり自由であり、多くのことが利用できます。

あなたの状況では、ほとんどのアクティビティが個別の APK にあるようです。その場合は、おそらくブロードキャスト インテントを送信して、システム全体に変更を知らせる必要があります。これらの変更がアクティビティの実行中にのみ問題になる場合は、変更を気にするアクティビティの存続期間中、BroadcastReceiver を登録できます。または、BroadcastReceiver をアプリケーション マニフェストに配置して、常にその変更を受け取ることもできます。

これにより、IntentServices が表示されます。IntentServices は、Android で長時間実行されるタスクを処理する「最も簡単な」方法です。サービスに送信されるインテントを処理するバックグラウンド スレッドを作成するだけです。一般的な使用例は次のとおりです。

  1. 反応する必要があるブロードキャスト インテントを受け取ります (時間がかかります)。
  2. ブロードキャスト インテントからの情報を使用して、指示されたインテント (コンポーネント名が設定されたインテント) を IntentService に送信します。
  3. IntentService は、新しい BG スレッドを生成するか、既存の BG スレッドの処理キューにインテントを追加します。
  4. onHandleIntent 関数は IntentService で呼び出されるため、必要なだけの処理時間を使用してその変更を処理できます。
于 2011-09-29T14:22:17.710 に答える