Какие механизмы межпроцессного взаимодействия используются в Android
Androidмежпроцессное взаимодействиеоперационные системыразработка под Androidсервисы и активити
Что проверяют
Знаете ли вы, что в основе всего лежит Binder, и понимаете ли ограничения передачи данных.
Как отвечать
Все приложения работают в отдельных процессах, поэтому общение идёт через ядро. Основной механизм это Binder: драйвер ядра плюс модель удалённого вызова. Через него ходят вообще все системные вызовы Android, включая запуск активностей и обращения к системным службам.
Что построено поверх Binder:
- Intent: запуск компонентов и передача данных между приложениями, включая широковещательные сообщения;
- AIDL: описание интерфейса для сервиса, к которому подключаются из другого процесса. Генерирует заглушки и прокси;
- Messenger: упрощённый вариант поверх
Handler, если нужна очередь сообщений, а не параллельные вызовы; - ContentProvider: доступ к данным по URI, стандартный способ отдать наружу контакты, галерею, свои сущности;
- системные службы:
getSystemServiceэто тоже вызов через Binder.
Что важно про ограничения:
- транзакция Binder ограничена по размеру: буфер около мегабайта на процесс, и практический предел заметно ниже. Отсюда падение при передаче крупных объектов через
IntentилиBundle. Большие данные передают через файл,ContentProviderили общий файловый дескриптор; - объекты передаются как
Parcelable, а не сериализуются в поток: это быстрее и заточено под IPC; - вызовы синхронные по умолчанию и выполняются в пуле потоков Binder, поэтому долгую работу в них делать нельзя.
Где спотыкаются
Пытаются передать большой список через Intent.
Считают, что Serializable и Parcelable равнозначны.
Не знают, что даже обычный startActivity идёт через Binder.
Делают тяжёлую работу прямо в методе AIDL-интерфейса.