Что такое binder android

Русские Блоги

Использование многопроцессорного Android Binder

Android многопроцессная серия

Что такое Биндер

  • Binder — это класс Android, который реализует интерфейс IBinder
  • С точки зрения IPC, Binder является методом межпроцессного взаимодействия в Android
  • Биндер также можно понимать как виртуальное физическое устройство. Драйвером устройства является / dev / binder, который недоступен в Linux.
  • С точки зрения Android Framework, Binder является мостом для ServiceManger для соединения различных Mangers (ActivityManager, WindowManager и т. Д.) И соответствующего ManagerService.
  • На уровне приложений Android Binder является средой для связи между клиентом и сервером. Когда возвращается bindService, возвращается объект Binder сервера. Объект Binder может вызывать службу сервера.

Использование Binder

Создать класс связующего
  • Binder может быть сгенерирован двумя способами: пусть система автоматически генерирует файлы AIDL, мы сами пишем Binder
Создать Binder из файла AIDL
  • Сначала вам нужно подготовить объект Parcelable
  • Затем напишите файл AIDL

  • После записи файла соответствующий класс Binder можно сгенерировать с помощью команды Make Project.

Имитация межпроцессного взаимодействия между клиентом и сервером
  • Сначала напишите класс Service и установите свойство android: process для запуска в другом процессе.
  • Регистрация Сервис

  • Затем клиент просто связывает сервер через метод bindService в действии, а затем вызывает метод сервера через возвращенное связующее.
  • Благодаря вышеописанным шагам мы достигли простого примера межпроцессного взаимодействия


Процедура вызова
  • Через напечатанный журнал мы можем приблизительно проанализировать процесс вызова каждого метода в приведенном выше примере, где мы анализируем процесс вызова сервера для получения списка книг.
  • После того, как клиент вызывает метод bindService, создается BookManagerService и вызывается конструктор класса Binder для создания Binder
  • Затем метод onBind BookManagerService возвращает созданное связующее средство клиенту
  • Вызывается метод onServiceConnected клиента, а затем вызывается метод asInterface объекта Binder для получения объекта типа интерфейса AIDL bookManager.
  • Вызов метода getBookList bookManager фактически вызывает метод getBookList, соответствующий классу Proxy в классе Binder.
  • В методе getBookList, соответствующем классу Proxy, вызовите транзакционный метод Биндера, чтобы инициировать запрос удаленного вызова процедуры. В то же время текущий поток приостанавливается и будет вызываться метод onTransact сервера.
  • Вызывается метод onTransact сервера, а конкретный вызываемый метод находится в коде. Вот TRANSACTION_getBookList
  • Наконец, метод getBookList, соответствующий объекту mBinder в BookManagerService, вызывается для возврата списка книг mBookList. Возвращенный результат находится в ответе переменной Parcel.
  • Метод getBookList в классе Proxy получает данные, возвращаемые сервером, через result = reply.createTypedArrayList (Book.CREATOR);
  • Данные принимаются в клиентском методе onServiceConnected, и вызывающий процесс заканчивается
Очки к сведению
  • Когда клиент вызывает удаленный запрос, текущий поток клиента будет приостановлен до тех пор, пока процесс сервера не вернет данные, поэтому удаленный запрос не может быть инициирован в потоке пользовательского интерфейса.
  • Методы клиента onServiceConnected и onServiceDisconnected выполняются в потоке пользовательского интерфейса. В нем нельзя напрямую вызывать трудоемкие методы сервера.
  • Метод Binder на стороне сервера выполняется в пуле потоков Binder, поэтому метод Binder должен реализовываться синхронизированным образом независимо от того, отнимает ли он время или нет.
  • Как и выше, метод Binder сервера должен иметь дело с синхронизацией потоков.В приведенном выше примере CopyOnWriteArrayList поддерживает одновременное чтение и запись и автоматически обрабатывает синхронизацию потоков.
  • Единственный список, который можно использовать в AIDL, это ArrayList, но AIDL поддерживает абстрактные списки. Поэтому, хотя сервер возвращает CopyOnWriteArrayList, в Binder он получит доступ к данным в соответствии со спецификацией List и в конечном итоге сформирует новый ArrayList для передачи клиенту.
Читайте также:  Android ice cream sandwich поддерживаемые телефоны

эпилог

  • Выше приведено лишь простое применение Binder. Есть еще много проблем в использовании Binder, которые требуют внимания.
  • Что делать после того, как Биндер неожиданно умер?
  • Как зарегистрироваться для прослушивания обратного вызова и уведомить клиента, который зарегистрировал обратный вызов, как только на сервере появится новое сообщение? Как мне отменить регистрацию?
  • Как проверить разрешения и т. Д.

Добро пожаловать, обратите внимание на мой публичный аккаунт в WeChat, учитесь и развивайтесь вместе со мной!

Интеллектуальная рекомендация

Многослойная презентацияViewController Jap

. Недавно, проект использует многоэтажные прыжки [A presentViewController: B animated: YES] [B presentViewController: C animated: YES] . Проблема в том, где: как это идет прямо к? Я не нашел ме.

Распечатать список с конца до головы

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

Типы данных и переменные

тип данных Компьютерная программа может обрабатывать различные значения. Однако компьютеры могут обрабатывать гораздо больше, чем числовые значения. Они также могут обрабатывать различные данные, таки.

Python Daily Practice (4) -идиомы заполняют музыку

оглавление 1. Одно место 2. Случайное расположение 3. Добавьте баллы для оценки 4. Получение файла 5. Установите уровень сложности. 6. Срок завершения 7. Выберите заполнение пропусков. 1. Одно место Н.

Источник

Полный список

— используем биндинг для подключения к сервису

В прошлых уроках мы общались с сервисом асинхронно. Т.е. мы отправляли запрос через startService, а ответ нам приходил когда-нибудь потом посредством PendingIntent или BroadcastReceiver.

Но есть и синхронный способ взаимодействия с сервисом. Он достигается с помощью биндинга (binding, я также буду использовать слово «подключение»). Мы подключаемся к сервису и можем взаимодействовать с ним путем обычного вызова методов с передачей данных и получением результатов. В этом уроке передавать данные не будем. Пока что разберемся, как подключаться и отключаться.

Как вы помните, для запуска и остановки сервиса мы использовали методы startService и stopService. Для биндинга используются методы bindService и unbindService.

Создадим два Application. В одном будет приложение, в другом сервис.

Создадим первый проект:

Project name: P0971_ServiceBindClient
Build Target: Android 2.3.3
Application name: ServiceBindClient
Package name: ru.startandroid.develop.p0971servicebindclient
Create Activity: MainActivity

Добавим в strings.xml строки:

4 кнопки: для запуска, остановки и биндинга сервиса

В onCreate мы создаем Intent, который позволит нам добраться до сервиса.

Объект ServiceConnection позволит нам определить, когда мы подключились к сервису и когда связь с сервисом потеряна (если сервис был убит системой при нехватке памяти). При подключении к сервису сработает метод onServiceConnected. На вход он получает имя компонента-сервиса и объект Binder для взаимодействия с сервисом. В этом уроке мы этим Binder пока не пользуемся. При потере связи сработает метод onServiceDisconnected.

Читайте также:  Adobe flash player обновить для андроида

Переменную bound мы используем для того, чтобы знать – подключены мы в данный момент к сервису или нет. Соответственно при подключении мы переводим ее в true, а при потере связи в false.

Далее идут обработчики кнопок. В onClickStart мы стартуем сервис, в onClickStop – останавливаем.

В onClickBind – соединяемся с сервисом, используя метод bindService. На вход передаем Intent, ServiceConnection и флаг BIND_AUTO_CREATE, означающий, что, если сервис, к которому мы пытаемся подключиться, не работает, то он будет запущен.

В onClickUnBind с помощью bound проверяем, что соединение уже установлено. Далее отсоединяемся методом unbindService, на вход передавая ему ServiceConnection. И в bound пишем false, т.к. мы сами разорвали соединение. Метод onServiceDisconnected не сработает при явном отключении.

Создадим второй проект, без Activity:

Project name: P0972_ServiceBindServer
Build Target: Android 2.3.3
Application name: ServiceBindServer
Package name: ru.startandroid.develop.p0972servicebindserver

Создаем сервис MyService.java:

Методы onCreate и onDestroy нам знакомы – они вызываются при создании и уничтожении сервиса. А onBind, onRebind и onUnbind используются при биндинге и мы далее будем смотреть как именно. Метод onStartCommand не используем.

В методе onBind возвращаем пока объект-заглушку Binder. В этом уроке он не будет использован.

Прописываем сервис в манифесте и настраиваем для него IntentFilter с Action = ru.startandroid.develop.p0972servicebindserver.MyService.

Все сохраняем, инсталлим сервис и запускаем приложение.

На самом экране ничего происходить не будет. Все внимание на логи.

Попробуем подключиться к неработающему сервису. Жмем Bind. В логах:

MyService onCreate
MyService onBind
MainActivity onServiceConnected

Сервис создался и сработал его метод onBind. Также сработал метод onServiceConnected в ServiceConnection, т.е. Activity теперь знает, что подключение к сервису установлено.

Попробуем отключиться. Жмем Unbind.

MyService onUnbind
MyService onDestroy

Сработал метод Unbind в сервисе и сервис закрылся. Т.е. если мы биндингом запустили сервис, он будет жить, пока живет соединение. Как только мы отключаемся, сервис останавливается. onServiceDisconnected не сработал, т.к. мы сами отключились.

Теперь попробуем соединиться с сервисом и убить его. Посмотрим, что станет с соединением. Жмем Bind.

MyService onCreate
MyService onBind
MainActivity onServiceConnected

Теперь в процессах убиваем процесс сервиса

Сработал метод onServiceDisconnected объекта ServiceConnection. Тем самым Activity уведомлено, что соединение разорвано.

Теперь немного подождем (у меня это заняло 5 секунд) и в логах появляются строки:

MyService onCreate
MyService onBind
MainActivity onServiceConnected

Сервис запустился и соединение восстановилось. Очень удобно.

Жмем Unbind и отключаемся.

Попробуем снова подключиться к незапущенному сервису, но уже без флага BIND_AUTO_CREATE. Перепишем onClickBind в MainActivity.java:

Вместо флага BIND_AUTO_CREATE мы написали 0.

Сохраняем, запускаем. Жмем Bind. В логах ничего. Мы убрали флаг, сервис сам не создается при подключении.

Давайте запустим его методом startService. Жмем Start. В логах:

Читайте также:  Андроид мигающий фонарик при вызове

MyService onCreate
MyService onBind
MainActivity onServiceConnected

Сервис создался и приложение подключилось к нему. Т.е. попыткой биндинга мы оставили некую «заявку» на подключение, и когда сервис был запущен методом startService, он эту заявку увидел и принял подключение.

Отключились от сервиса. Но сервис продолжает жить, потому что он был запущен не биндингом, а методом startService. А там уже свои правила закрытия сервиса. Это мы проходили в прошлых уроках.

Сервис завершил работу.

Попробуем запустить сервис методом startService и, пока он работает, несколько раз подключимся и отключимся. Жмем Start.

Подключаемся и отключаемся, т.е. жмем Bind

MyService onBind
MainActivity onServiceConnected

Сработали методы onBind и onUnbind в сервисе, и onServiceConnected в ServiceConnection.

Еще раз подключаемся и отключаемся — жмем Bind, а затем Unbind

При повторном подключении к сервису методы onBind и onUnbind не сработали. Только onServiceConnected.

И далее, сколько бы мы не подключались, так и будет.

Остановим сервис – нажмем Stop.

Это поведение можно скорректировать. Для этого необходимо возвращать true в методе onUnbind. Сейчас мы там вызываем метод супер-класса, а он возвращает false.

Перепишем метод Unbind в MyService.java:

Сохраним и инсталлим сервис. Жмем Start, а затем жмем поочередно Bind и Unbind, т.е. подключаемся и отключаемся. Смотрим логи:

MyService onCreate
MyService onBind
MainActivity onServiceConnected
MyService onUnbind

Сервис создан, подключились и отключились. Продолжаем подключаться и отключаться.

MyService onRebind
MainActivity onServiceConnected
MyService onUnbind
MyService onRebind
MainActivity onServiceConnected
MyService onUnbind

Последующие подключения и отключения сопровождаются вызовами методов onRebind и onUnbind. Таким образом, у нас есть возможность обработать в сервисе каждое повторное подключение/отключение.

Вот примерно такой Lifecycle имеет биндинг сервиса. Разумеется, я рассмотрел не все возможные комбинации запуска методов startService, stopService, bindService и unbindService. Оставляю это вам, если есть интерес. Я рассмотрел только типичные случаи.

Также я не рассматривал возможность одновременного подключения нескольких приложений или сервисов к одному сервису. А такая возможность существует. В этом случае, если сервис запущен биндингом, то он будет жить, пока не отключатся все подключившиеся.

Насколько я понял по хелпу, не рекомендуется оставлять незавершенные подключения к сервисам по окончании работы приложения. В хелповских примерах подключение к сервису производится в методе onStart, а отключение — в onStop. Но, разумеется, если вам надо, чтобы подключение оставалось при временном уходе Activity в background, то используйте onCreate и onDestroy. Также есть четкая рекомендация от гугла — не использовать для этих целей onResume и onPause.

На следующем уроке:

— обмен данными в биндинге

Присоединяйтесь к нам в Telegram:

— в канале StartAndroid публикуются ссылки на новые статьи с сайта startandroid.ru и интересные материалы с хабра, medium.com и т.п.

— в чатах решаем возникающие вопросы и проблемы по различным темам: Android, Kotlin, RxJava, Dagger, Тестирование

— ну и если просто хочется поговорить с коллегами по разработке, то есть чат Флудильня

— новый чат Performance для обсуждения проблем производительности и для ваших пожеланий по содержанию курса по этой теме

Источник

Оцените статью