Это довольно открытый вопрос, но позвольте мне вкратце описать, как я считаю, что взаимодействие внутри / между приложениями работает лучше всего.
Одним из ключевых аспектов обмена сообщениями Android является концепция слабой связи всех компонентов приложения. Поскольку все приложения выполняются в отдельном процессе, и одно «приложение» может фактически состоять из нескольких приложений (отвечающих за предоставление различных операций или служб), все методы обмена сообщениями основаны на идее маршалинга сообщений через границы процесса.
Intents
Предпочитаемый метод обмена сообщениями, всегда старайтесь по возможности использовать намерение. Это самый «родной» способ передачи сообщений в Android.
Преимущества
Использование Intents для обмена сообщениями обеспечивает слабую привязку компонентов приложения, позволяя беспрепятственно передавать сообщения между несколькими приложениями. Интенты интенсивно используются в основной системе для запуска операций и служб, а также для трансляции и получения системных событий.
Используя дополнительные комплекты, вы можете включать пары ключ / значение примитивов в качестве полезных данных в Intents, чтобы легко передавать информацию из одного компонента приложения в другой - даже если эти компоненты работают в разных процессах.
Недостатки
Поскольку Intents предназначены для перехода между процессами, полезная нагрузка extras поддерживает только примитивные типы. Если вам нужно отправить объект с помощью Intent, вам нужно будет разложить его на примитивы на одном конце и реконструировать на другом.
Класс применения
Если вы хотите общаться только в одном приложении, запущенном в одном процессе, это удобное решение.
Преимущества
Расширяя класс Application
(и реализуя его как Singleton), вы получаете объект, который будет существовать всякий раз, когда существует любой из ваших компонентов приложения, предоставляя централизованное место для хранения и передачи данных сложных объектов между компонентами приложения.
Недостатки
Этот метод ограничивает обмен сообщениями компонентами в одном приложении.
Служба привязки, IPC и AIDL
Привязка к сервису позволяет вам получать доступ к его методам и обмениваться объектами с ним. AIDL - это способ определения того, как сериализовать объект в примитивы ОС, чтобы его можно было распределить через границы процессов, если служба, к которой вы привязываетесь, работает в отдельном приложении.
Преимущества
Когда вы привязываетесь к Сервису, вы получаете к нему доступ, как если бы он был объектом в вызывающем классе. Это означает, что вы можете выполнять методы в Сервисе и обмениваться с ним расширенными объектами.
Обратите внимание, что если вы привязываетесь к Сервису в другом процессе приложения, вам необходимо создать определения AIDL, которые сообщают Android, как разделить / десериализовать любые объекты, которые вы хотите передать между приложениями.
Недостатки
Создание классов AIDL для IPC - это немного дополнительная работа, а привязка создает дополнительные зависимости между службами и операциями, которые могут усложнить ядру очистку ресурсов, когда другие приложения испытывают нехватку ресурсов.
Маршеллинг-сообщения через границы процессов, тем не менее, дороги. Поэтому, если вы не выполняете методы в Сервисе, использование связывания и IPC, вероятно, является излишним - посмотрите, сможете ли вы добиться того же, используя Intents.
Гнезда
Если вы используете сокеты для связи внутри или между приложениями, работающими на одном устройстве, это либо потому, что другого пути нет, либо вы где-то пропустили хитрость. Если ваши сообщения покидают устройство, сокеты - это хорошая, быстрая альтернатива. Если вы остаетесь на устройстве, скорее всего, Intents или IPC будет лучшим вариантом.