2011-08-17 8 views
6

メインアクティビティ(Act.A)は、Bluetooth接続を保持するサービスを開始します。 1つのサービス(Bluetooth接続)を共有する2つのアクティビティを最適に実装する方法

サービスは、MessengerとハンドラMessengerService(Androidのリモートメッセンジャーサンプル)に応じて、追加

で修飾し BluetoothChatService(アンドロイドBluetoothChatサンプル)の修正版... ...である(これは、サービスを結合します)

アクティビティAは、Bluetoothが外部デバイスに接続されていることを確認し、後で別のアクティビティ(Act B)を開始します。

問題は、サービスを継続して実行し、Bluetooth接続を新しいアクティビティに円滑に提供することです。私はどのように知りません。

  • を、それが活動のAから切り替えたときに、サービスが再起動またはreinstancedされていないことを確認してくださいBに

  • 必要に応じてmessenging機能が動作することを確認してください(から現在アクティブな活動)

私は新しい活動にサービスを再バインドする必要がありますか、どのように私は)によるサービスの他のインスタンスに(BT接続が失われないことを保証しますか? また、Messengerオブジェクトを新しいアクティビティに渡して、既存のインスタンス化されたサービスと通信する必要がありますか。もしそうなら、私はそれをどのように最善にするのですか?

回答には非常に感謝しています。

答えて

1

Applicationをサブクラス化してそこに情報を格納するか(hereを参照)、サービスがシングルトンになる可能性があります。そのため、nullの場合にのみ初期化する独自の型の静的メンバーがあります。

6

サービスを「スティッキー」にして、サービスを継続します。また、2つのアクティビティの基本アクティビティクラスを作成します。基本アクティビティクラスは、サービスとのバインドと適切な通信の共通機能をすべて処理できます。アクティビティが一時停止したときにサービスをバインド解除することをお勧めします。しかし、これは共通の基底クラスのアクティビティで一度行うことができます。

サービスへのバインディングは、まだ実行されていない場合にのみ開始する必要があります。また、再開/一時停止でバインド/バインドを解除する場合は、いつでもサービスへのアクティブな接続を1つだけ設定する必要があります。

1

これは古い質問ですが、今日この状況を乗り越えて、他の回答に基づいて動作する解決策を思いつきました。私は実用的な実装を見つけることができなかったので、私は好奇心かもしれない他の人のためにそれを投稿します。私は「スティッキー・サービス」を作成し、ライフサイクルの管理とサービスのバインドを担当するServiceManagerクラスを作成しました。次に、ServiceManagerクラスをApplicationのサブクラスに入れて、アクティビティがスコープ付きグローバルとしてアクセスできるようにします。それはうまくいく。ソースはGitHubにあります。