Когда мне следует использовать разные типы сообщений Android? - PullRequest
5 голосов
/ 28 мая 2009

Я работаю с Android уже более года, но мне все еще не удается определить, когда следует использовать различные типы сообщений / сообщений между процессами / потоками. Я в основном говорю о трансляции Intents, используя AIDL для services, используя обработчики для отправки сообщений и сокетов.

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

Ответы [ 4 ]

15 голосов
/ 04 июня 2009

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

Одним из ключевых аспектов обмена сообщениями Android является концепция слабой связи всех компонентов приложения. Поскольку все приложения выполняются в отдельном процессе, и одно «приложение» может фактически состоять из нескольких приложений (отвечающих за предоставление различных операций или служб), все методы обмена сообщениями основаны на идее маршалинга сообщений через границы процесса.

Intents

Предпочитаемый метод обмена сообщениями, всегда старайтесь по возможности использовать намерение. Это самый «родной» способ передачи сообщений в Android.

Преимущества

Использование Intents для обмена сообщениями обеспечивает слабую привязку компонентов приложения, позволяя беспрепятственно передавать сообщения между несколькими приложениями. Интенты интенсивно используются в основной системе для запуска операций и служб, а также для трансляции и получения системных событий.

Используя дополнительные комплекты, вы можете включать пары ключ / значение примитивов в качестве полезных данных в Intents, чтобы легко передавать информацию из одного компонента приложения в другой - даже если эти компоненты работают в разных процессах.

Недостатки

Поскольку Intents предназначены для перехода между процессами, полезная нагрузка extras поддерживает только примитивные типы. Если вам нужно отправить объект с помощью Intent, вам нужно будет разложить его на примитивы на одном конце и реконструировать на другом.

Класс применения

Если вы хотите общаться только в одном приложении, запущенном в одном процессе, это удобное решение.

Преимущества

Расширяя класс Application (и реализуя его как Singleton), вы получаете объект, который будет существовать всякий раз, когда существует любой из ваших компонентов приложения, предоставляя централизованное место для хранения и передачи данных сложных объектов между компонентами приложения.

Недостатки

Этот метод ограничивает обмен сообщениями компонентами в одном приложении.

Служба привязки, IPC и AIDL

Привязка к сервису позволяет вам получать доступ к его методам и обмениваться объектами с ним. AIDL - это способ определения того, как сериализовать объект в примитивы ОС, чтобы его можно было распределить через границы процессов, если служба, к которой вы привязываетесь, работает в отдельном приложении.

Преимущества

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

Обратите внимание, что если вы привязываетесь к Сервису в другом процессе приложения, вам необходимо создать определения AIDL, которые сообщают Android, как разделить / десериализовать любые объекты, которые вы хотите передать между приложениями.

Недостатки

Создание классов AIDL для IPC - это немного дополнительная работа, а привязка создает дополнительные зависимости между службами и операциями, которые могут усложнить ядру очистку ресурсов, когда другие приложения испытывают нехватку ресурсов.

Маршеллинг-сообщения через границы процессов, тем не менее, дороги. Поэтому, если вы не выполняете методы в Сервисе, использование связывания и IPC, вероятно, является излишним - посмотрите, сможете ли вы добиться того же, используя Intents.

Гнезда

Если вы используете сокеты для связи внутри или между приложениями, работающими на одном устройстве, это либо потому, что другого пути нет, либо вы где-то пропустили хитрость. Если ваши сообщения покидают устройство, сокеты - это хорошая, быстрая альтернатива. Если вы остаетесь на устройстве, скорее всего, Intents или IPC будет лучшим вариантом.

2 голосов
/ 09 июня 2015

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

1 голос
/ 29 мая 2009

Мои 2 цента

  • Я не использовал локальные сокеты. Похоже, излишним, так как вы должны генерировать и анализировать данные.
  • Содержание предназначено для любых вещей, которые другие приложения могут захотеть сделать (запустить я в окне или выбрать что-то вышло)
  • AIDL / Посылки / Обработчики для GUI говорить с безголовым процессом, который работает постоянно. В зависимости от приложение много фактических данных передача может происходить с использованием контента провайдер, но я склонен иметь некоторые данные что нужно перенести на улицу этого канала.
0 голосов
/ 16 октября 2010

Это хорошая статья, которую я нашел полезной при попытке найти замену классу NSUserDefaults Какао:

http://developer.android.com/guide/appendix/faq/framework.html

...