bindService, unbindService, android и сценарии без солнечного дня - PullRequest
3 голосов
/ 09 ноября 2011

Это больше вопрос о внутренностях Android для людей, которые сталкивались с подобными сомнениями в прошлом.

Вопрос довольно прост по сути:

при условии, что у меня есть служба привязки, которая предоставляет определенные функциональные возможности приложениям, работающим в других процессах - как я могу узнать, все ли еще существует функция, запрашивающая вызывающую сторону?

Предположим, у меня есть удаленный сервис, который реализует удаленные обратные вызовы, как упомянуто здесь , как я могу быть уверен, что еще есть класс для получения обратного вызова? как проводится уборка? привязка автоматически закрывается, когда приложение выходит / падает, как это происходит с открытыми файлами или сокетами?

и наконец:

если удаленное приложение завершает работу без открепления от моего сервиса, будет ли оно работать, даже если это было последнее приложение, использовавшее сервис?

спасибо за все советы, ребята, ценю это.

Ответы [ 2 ]

1 голос
/ 09 ноября 2011

Я только что проверил это, и даже если внешний компонент пропустит ServiceConnection из-за невозможности отсоединения, Android убьет службу (при условии, что она не была запущена с startService и не привязана где-либо еще). В этом случае будут вызываться onUnbind и onDestroy.

Что касается определения того, все ли компоненты, которые зарегистрировали обратные вызовы, все еще живы, я считаю, что CommonsWare верен в том смысле, что вам следует просто попробовать обратный вызов. Однако вы должны иметь возможность активировать вызывающий компонент и снова включить его.

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

  1. Внешний компонент должен получать обратный вызов от вашей службы, только если рассматриваемый компонент еще жив. В этом случае просто проглотите (и зарегистрируйте) исключение, выданное при попытке вызвать мертвый обратный вызов.
  2. Внешний компонент, который больше не работает, ДОЛЖЕН быть разбужен, когда ваша служба пытается выполнить обратный вызов. Так как вы не можете сделать это с помощью обычных методов обратного вызова, вам нужно активировать некоторые намерения, чтобы разбудить мертвый компонент. Самый простой способ сделать это - предоставить методы для компонента, чтобы зарегистрировать PendingIntent в вашей службе. Если нормальный обратный вызов не удался, просто запустите PendingIntent. Внешний компонент (который должен был быть зарегистрирован как получатель для связанного намерения), проснется и соответствующим образом отреагирует на намерение, возможно, путем повторного связывания и вызова дополнительных методов для получения результата неудачного обратного вызова. Предостережение заключается в том, что если вы разрешите вызывающим абонентам умирать, и они будут ожидать пробуждения, вам потребуется служба, которая запускается сама через startService () и останавливается соответствующим образом, так как в противном случае вы можете быть собраны во время выполнения. запрошенная работа до запуска PendingIntent
0 голосов
/ 09 ноября 2011

при условии, что у меня есть служба привязки, которая предоставляет определенную функциональность приложениям, работающим в других процессах - как я могу узнать, все ли еще есть функция, запрашивающая вызывающую сторону?

Ты не, AFAIK.

предположим, у меня есть удаленный сервис, который реализует удаленные обратные вызовы, как упомянуто здесь, как я могу быть уверен, что еще есть класс для получения обратного вызова?

Вы должны получить RemoteObjectException, если объект обратного вызова больше не может использоваться (например, клиент пропал).

как производится очистка?

Понятия не имею, что это значит в этом контексте, извините.

привязка автоматически закрывается, когда приложение выходит / падает, как это происходит с открытыми файлами или сокетами?

Да, хотя вы не уведомлены об этом факте в службе.

если удаленное приложение завершает работу без открепления от моего сервиса, будет ли оно работать, даже если это было последнее приложение, использовавшее сервис?

Не знаю наверняка. Я надеюсь, что Android обнаружит это и остановит службу, но я не пробовал этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...