web-dev-qa-db-ja.com

Androidサービス:onBind(Intent)およびonUnbind(Intent)は一度だけ呼び出されます

アクティビティとサービスがあります。 Activityが開始されると、startService()を呼び出して、Activityが破棄された場合でもこのサービスを有効にし、bindService()を呼び出してこのサービスと通信します。

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

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

次に、このアクティビティを再び開始し、bindService()がtrueを返し、mService.onBind()[〜#〜] not [〜#〜]と呼ばれます!ただし、ServiceConnection.onServiceConnected()も呼び出され、すべて正常に機能します。

Dalvikは私のonBind()が前回返したものを記憶しており、onBind()を再度呼び出していないようです。アクティビティを再度破棄すると、onUnbind()[〜#〜] not [〜#〜]とも呼ばれます。

このサービスはいつでもアクティビティにバインドおよびバインド解除できますが、stopService()をバインド解除して呼び出してサービスを破棄するまで、これらのメソッドはもう呼び出されません。

ドキュメントでは、この動作の説明を見つけることができません。逆に、 この図 は、クライアントがサービスをバインドおよびバインド解除するたびにonBind()およびonUnbind()を呼び出す必要があることを示しています。この図は、 この開発ガイド の下部にあります。

41
Dmitry Frank

this (公式開発者ガイドから参照)がすべてのクエリを説明できると思います:

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

53
yorkw

ここで見つけることができます: https://developer.Android.com/guide/components/bound-services.html

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

0
Amol K