2016/07/13

[android]Serviceは1つ?

アプリに用意したServiceは複数インスタンスというか複数サービスというか、とにかく1つのclassから複数は生成できないような感じがしている。


バインドされたサービス | Android Developers

1つのBLE PeripheralにアクセスするServiceを作った。
作ったというか、BDSサンプルがそんな感じだったので、そうなった。
こあれを、複数台のPeripheralでも接続できるようにしたい。

これを読んでいて、基本のところに「複数のクライアントが同時にサービスに接続できます」と書いてある。
だから、Serviceを複数作って、それぞれバインドしてやればいいはずだ、と思ったのだ。

やってみたのだけど、なんだか動きがおかしい。。。
bindService()を呼ぶと、2つともServiceConnectionのonServiceConnected()は呼び出されているのだが、なんか、なんかおかしい。
呼ぶときのContextは、同じ画面上なので、同じActivityだ。

このフィールドの値が変わっていたらログが出ているはずなのに、出ていないのに値が初期値と違うとか、ログが出て値が変わっているはずなのに、変わったことになっていないとか。

 

HandlerのhandleMessage()でServiceからの通知を受け取っているのだけど、そこら辺がおかしいのよねぇ。
Handlerは、onServiceConnected()のところでServiceに渡している。

デバッガで追っていったところ、渡しているHandlerが最後にonServiceConnected()が呼ばれたときのものに差し替わっているようだ。
staticフィールドではないので、やはり大元が1つになったままということか。。。


というわけで、もうちょっと簡単に確認することにした。
Serviceの中にstaticではないint変数を用意して、onServiceConnected()で呼ぶgetService()でカウントアップさせるのだ。
bindService()ごとに作られているなら、毎回同じカウントのはず。。。

うん、カウントアップされますね。

 

つまり「複数のクライアントが同時にサービスに接続できます」というのは、接続できるサービスが異なる場合は、ということになる。
同じActivity上だと、クライアントとしては1人扱いになるのだろうね。
まあ、context.bindService()と2回呼んでいるだけだから、同じクライアントじゃないか、と言われても否定のしようがない。

 

たぶん「複数のクライアント」というのは、複数のActivityだったり、複数のアプリだったり、そういう人たちなのだろう。
クライアントの定義を確認せんかったのが悪かった。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。