2012-01-09 24 views
36

私はアクティビティとサービスを持っています。アクティビティが開始されると、このサービスと通信するために、アクティビティが破棄されてもこのサービスを生存させるためにstartService()bindService()が呼び出されます。Androidサービス:onBind(インテント)とonUnbind(インテント)は一度だけ呼び出されます

bindService()がtrueを返し、mService.onBind()が呼び出され、ServiceConnection.onServiceConnected()も呼び出されます。すべての作品。

バックキーを押してアクティビティを破棄すると、unbindService()が呼び出され、mService.onUnbind()が呼び出されます。 (私はこのonUnbind()falseを返す。)

その後、私は真bindService()戻り、再度、この活動を開始し、その後、mService.onBind()は呼び出されません!しかし、ServiceConnection.onServiceConnected()も呼ばれ、すべてが再び動作します。

Dalvikは前回返されたonBind()を覚えていて、onBind()をもう一度呼び出さないようです。私の活動をもう一度破壊すると、onUnbind()で、も呼ばれます。

このサービスを自分のアクティビティに何度でもバインドしたりアンバインドすることはできますが、サービスを解除してstopService()を呼び出すまでこれらのメソッドは呼び出されません。

私はこの現象の説明を見つけることができません。逆に、this figureは、クライアントがサービスをバインドおよびバインド解除するたびにonBind()およびonUnbind()が呼び出されることを示しています。この数字は、this Dev Guideの下部に記載されています。

答えて

47

私は(公式のdevのガイドから参照)thisは、すべてのクエリを説明できると思う:

複数のクライアントを一度サービスに接続することができます。しかし、システムはサービスのonBind()メソッドを呼び出して、最初のクライアントがバインドされたときにのみIBinderを取得します。その後、システムは、onBind()を再度呼び出さずに、バインドする追加のクライアントに同じIBinderを配信します。

+21

ありがとう。私は残念ながら、これを逃した。しかし、私は 'onUnbind()'で真を返すことができ、 'onRebind()'と 'onUnbind()'が次のクライアントのために呼び出されることを発見しました。 –

+18

文書は実際には誤解を招くことがあります。 'onBind()'の呼び出しはこれ以上行われないと言いますが、これは複数のクライアントの場合にのみ適用されます。 Docsは、 "あなたのサービスが開始され、バインディングを受け入れるならば、システムがあなたのonUnbind()メソッドを呼び出したときに、あなたが次回クライアントがあなたにバインドしたときにonRebind()を呼びたいならば、サービス(**はonBind()への呼び出しを受け取る代わりに**) ")。 'onBind()'は呼び出されません。ドキュメンテーションが間違っているもう一つのケース。 – Malcolm

+0

@Malcolmのおかげで申し訳ありません...私はバインディングとアンバインドのものについて質問があります。私はServerSocketスレッドをそのサービスの中に入れ、Activity-Aでは、それに応じてバインディングとバインドを解除してonStart()とonStop()を配置します。別のアクティビティに移動して再度バインドすると再作成されますか?またはスレッドはまだ最後に残っていますか? – gumuruh

0

あなたはここでそれを見つけることができます:あなたが同時にサービスに複数のクライアントを接続することができます https://developer.android.com/guide/components/bound-services.html

。ただし、システムはIBinderサービス通信チャネルをキャッシュします。つまり、システムは、最初のクライアントがバインドされたときにのみ、IBinderを生成するためにサービスのonBind()メソッドを呼び出します。システムは、onBind()を再度呼び出さずに、同じIBinderを同じサービスにバインドするすべての追加のクライアントに配信します。

関連する問題