2012-03-05 4 views
5

私のアプリでは、私は常にデータを取得します(正当な理由のために、それはいくつかのセンサからだ)と2つのクライアントに提供するサービスを持つようにそれを設計した:Binderクラスを拡張するか、Messengerを使うべきですか?

  • A UIアクティビティのライブデータを表示するために
  • いつでもデータ

をログに記録します

  • 別のサービス、両方の、1つまたは複数のこれらのクライアントのどちらが実行される場合があります。

    私は、このサービスはBoundサービスでなければならないと思いますが、ロギングサービスはStartedサービスです。

    Android documentationの場合は、バインダークラスを拡張する必要があります。別のプロセスからサービスにアクセスするには、Messengerを使用する必要があります。

    このサービス、ロギングサービス、およびUIアクティビティはすべて同じapkになるため、おそらく同じプロセスになるでしょうが、ここでは最高の解決策は何でしょうか?ドキュメントは、サービスと同じプロセスで2つのクライアントを持つ可能性を考慮していない可能性があります。

    おかげ

  • 答えて

    -1

    imrankhanの推奨ソリューション(バインダー)はうまくいきましたが、最終的には実際にはこのソリューションをより柔軟にコーディングすることができました。

    9

    アンドロイドdocumentationがはっきり
    (一般的です)バインダークラス
    あなたのサービスは、独自のアプリケーションにプライベートであり、クライアントと同じプロセスで実行された場合
    の拡張を言い、バインダークラスを拡張し、そのインスタンスをonBind()から返すことで、インターフェイスを作成する必要があります。クライアントはバインダーを受け取り、それを使用して、バインダー実装またはサービスで利用可能なパブリックメソッドに直接アクセスできます。 これは、サービスが自分のアプリケーションのバックグラウンドワーカーに過ぎない場合に推奨される方法です。このようにインターフェイスを作成しない唯一の理由は、サービスが他のアプリケーションや別のプロセスで使用されているためです。あなたが別のプロセス間で動作するようにインターフェイスが必要な場合はメッセンジャー
    を使用

    、あなたはメッセンジャーとのサービスのためのインタフェースを作成することができます。このように、サービスは、異なるタイプのMessageオブジェクトに応答するHandlerを定義します。このハンドラは、Messengerの基本であり、IBinderをクライアントと共有し、クライアントがMessageオブジェクトを使用してサービスにコマンドを送信できるようにします。さらに、クライアントは独自のメッセンジャーを定義できるため、サービスはメッセージを返信することができます。 これは、プロセス間通信(IPC)を実行する最も簡単な方法です。これは、メッセンジャーがすべての要求を1つのスレッドにキューイングし、サービスをスレッドセーフに設計する必要がないためです。

    このサービスがローカルサービスの場合、IBinderクラスを拡張してサービスを使用することをお勧めします。 MessengerAIDLを使用して両方のサービスを作成すると、リモートサービスとなります。

    +0

    これは、サービスとアクティビティの両方をクライアントとして同時に使用する予定ですか? – CNorris

    +0

    はい、両方とも動作し、システムはすべてのクライアントに同じ 'IBinder 'を配信します –

    関連する問題