Andoidアプリで、通信(USB,Bluetooth,WiFi)を誰が持つかという問題について。
※ アプリ苦手なのでいろいろ間違ってるかも。ご意見いただけると幸いです。
Activity
簡単なサンプルソースだとだいたいActivityで持ってます。しかし、画面遷移のあるアプリで、ある画面のActivityで通信を持っちゃうと、他の画面に遷移したときに通信を引き継げません。また、単一画面のアプリであっても、スクリーンタイムアウトで通信が切れるようなことがあります。では、何に通信を持たせれば良いのでしょうか?
Fragment
Android3.0でFragmentが導入されました。FragmentはActivityの一部となる再利用可能な部品です。WindowsのFormアプリでいえばActiveXコントロールみたいなかんじでしょうか。ここに従来Activityが持っていた処理を集約させて可搬性を高めることができます。いまだ生き残っているAndroid2.Xにもバックポートされているらしいです。しかし、FragmentはあくまでActivityの一部なので、Activityと生死をともにします。
Service
Serviceは、直接ユーザが操作するUIを持たずバックグラウンドで実行されるタスクです。通信をサービスとして実装し、各画面のActivityはそのServiceをbindすれば、画面をまたいで通信を利用できそうです。
Application
Applicationはその名のとおり、アプリの大本であるクラスです。Applicationを継承して独自に拡張することはあまりないと思いますが、そうやってApplicationに通信を持たせて、各画面のActivetyからはstaticメソッドでシングルトン的にアクセスできそうです。
シングルトンなクラスで持つ
シングルトンであれば画面をまたいで一つの通信を利用することができそうですね。
けっきょく、どうすればいい?
ポイントとしては、(1)画面をまたいでも/画面が消えても通信が継続できること (2)接続時の画面操作(デバイス選択など)のUIを持つこと (3)ライブラリとして再利用しやすいこと です。
(1) | (2) | (3) | |
---|---|---|---|
Activity | × | ○ | × |
Fragment | × | ○ | ○ |
Service | ○ | × | ○ |
Application | ○ | × | × |
シングルトン | ○ | × | ○ |
というわけで、FragmentとService、またはFragmentとシングルトンの合わせ技になるのかな? まあ、色々じっさいに試してみることにします。もう丸一年以上Androidアプリ書いてないのでいろいろ忘れてますけど…