2010-11-23 5 views
3

サービスでBluetooth接続をしたい。そして、活動とサービスの間に相互作用が必要です。アプリが開始されるとすぐにサービスを開始し、特定の状況でUIアクティビティと通信できる必要があります。アクティビティまたは開始サービスと異なるプロセスでサービスにバインドしますか?

これを実行する適切な方法は何でしょうか? 1つのアクティビティからのみサービスをバインドすると、そのサービスはそのアクティビティとのみ通信します。だから、私はAIDLベースのアプローチを取る必要がありますか、これのために他の方法がありますか?

それ以外の場合は、Applicationクラスを拡張してそこからサービスを開始し、代わりにApplicationクラスをバインドするクラスを作成できますか?

答えて

1

これは非常に広い質問ですので、できる限り最善の答えを出します。私がサービスを知っていることから、複数のアクティビティですべてのサービスにアクセスできます。サービスをバインドしたすべてのアクティビティが(バインド解除によって)接続を終了すると、サービスは実際に停止します。

サービスのAndroidのドキュメントを教えてくれる:

...システムがある限り、それが起動またはコンテキストとそれへの1つ以上の接続がありますされるかのように実行されているサービスを維持します。 BIND_AUTO_CREATEフラグ。これらの状況のどちらも保持したら、サービスのonDestroy()メソッドが呼び出され、サービスが効果的に

を終了したので、私の推薦はそれと通信するために必要なすべての活動からサービスをバインドすることです。サービスにバインドするときは、サービスと通信するために使用できるIBinderが返されます。再びサービスに関するAndroidのドキュメントに従う:

通常、返されるIBinderは、aidlで書かれた複雑なインターフェースのものです。

サービスとの単純な通信だけが必要な場合は、完全なAIDLファイルを書く代わりにMessengerクラスを使用できます。これのサンプルはhereです。

これはあなたの質問にお答えします。

0

上記の回答状態としてサービスに直接バインドすることはできますが、メッセンジャーは必要ありません。あなたのサービスはあなたの活動と同じプロセスで99.9%の時間稼働します。メッセンジャーは、プロセス間通信(IPC)用に設計されています。また、高度なIPCのために設計されたAIDLも必要ありません。

代わりに、BroadcastReceiversIntentsを使用してください。これが彼らのために設計されたものです(アプリ内のコンポーネント間の通信)。

関連する問題