Подтвердить что ты не робот

Служба Android: onBind (Intent) и onUnbind (Intent) вызывается один раз

У меня есть Activity и Service. Когда действие запущено, он вызывает startService(), чтобы сделать эту службу работоспособной даже тогда, когда действие уничтожено, и bindService(), чтобы связаться с этой службой.

bindService() возвращает true, вызывается mService.onBind() и вызывается ServiceConnection.onServiceConnected(). Все работает.

Когда я уничтожаю свою активность нажатием клавиши "Назад", она вызывает unbindService(), и вызывается мой mService.onUnbind(). (я возвращаю false в этом onUnbind().)

Затем я снова запускаю эту операцию, bindService() возвращает true, а затем mService.onBind() называется НЕ! Но ServiceConnection.onServiceConnected() также вызывается, и все работает снова.

Похоже, Dalvik помнит, что мой onBind() вернулся в прошлый раз, и просто не вызывает onBind() снова. Когда я снова уничтожу свою активность, onUnbind() вызывается NOT.

Я могу связывать и отвязывать эту службу в моей деятельности любое количество раз, но эти методы больше не будут вызываться, пока я не уничтожу Сервис, отвязавшись и вызывая stopService().

В документах я не могу найти никакого объяснения этого поведения. И наоборот, этот рисунок показывает, что onBind() и onUnbind() следует вызывать каждый раз, когда клиенты связывают и отключают Сервис. Этот рисунок можно найти в нижней части этого руководства для разработчиков.

4b9b3361

Ответ 1

Я думаю, this (ссылка из официального руководства для разработчиков) может объяснить все ваши запросы:

Несколько клиентов могут одновременно подключиться к службе. Однако система вызывает ваш метод onBind() для извлечения IBinder только тогда, когда первый клиент связывается. Затем система доставляет тот же IBinder любым дополнительным клиентам, которые связывают, не вызывая onBind() снова.

Ответ 2

Вы можете найти его здесь: https://developer.android.com/guide/components/bound-services.html

Вы можете одновременно подключить несколько клиентов к службе. Однако система кэширует канал связи службы IBinder. Другими словами, система вызывает метод onBind() для генерации IBinder только тогда, когда первый клиент связывается. Затем система доставляет тот же IBinder всем дополнительным клиентам, которые привязаны к той же службе, не вызывая снова onBind().