Я работаю над небольшим проектом Android, где необходимо разделить некоторые данные между несколькими действиями и службой, которая выполняется в отдельном процессе. Я просто хотел бы узнать, какие у меня варианты с точки зрения обмена данными? Класс приложения? IPC? На основе файлов? Трансляции? Спасибо, ребята!
Обмен данными между видами деятельности и услугами
Ответ 1
1. Похоже, вам нужно транслировать некоторую информацию. Вы, чем сможете установить широковещательные приемники в любой активности/услуге, о которой вы хотели бы получить уведомление.
Подробнее о Broadcastreceiver и о отправить трансляцию
2. Как передавать данные между Activity/Services в одном приложении?
Это зависит от типа данных, которые вы хотите предоставить:
Примитивные типы данных Чтобы поделиться примитивными данными между Activity/Services в приложении, используйте Intent.putExtras(). Для передачи примитивных данных, которые должны сохраняться, используйте механизм хранения Preferences.
Непостоянные объекты Для совместного использования сложных ненастроенных пользовательских объектов в течение короткой продолжительности рекомендуется использовать следующие подходы:
Класс android.app.Application
android.app.Application - базовый класс для тех, кому необходимо поддерживать состояние глобального приложения. К нему можно получить доступ через getApplication() из любой Activity или Service. Он имеет несколько методов жизненного цикла и будет автоматически создан Android, если вы зарегистрируете его в AndroidManifest.xml.
Публичное статическое поле/метод
Альтернативный способ сделать данные доступными для всех видов деятельности/служб - использовать общедоступные статические поля и/или методы. Вы можете получить доступ к этим статическим полям из любого другого класса вашего приложения. Чтобы совместно использовать объект, действие, которое создает ваш объект, устанавливает статическое поле, указывающее на этот объект, и любое другое действие, которое хочет использовать этот объект, просто обращается к этому статическому полю.
HashMap of WeakReferences to Objects
Вы также можете использовать HashMap of WeakReferences для объектов с длинными ключами. Когда действие хочет передать объект другому действию, оно просто помещает объект в карту и отправляет ключ (который является уникальным Long на основе счетчика или отметки времени) для активности получателя с помощью дополнительных утилит. Активность получателя извлекает объект с помощью этого ключа.
Класс Singleton
Есть преимущества использования статического Singleton, например, вы можете ссылаться на них, не отбрасывая getApplication() классу приложения или не повредив интерфейс во всех подклассах вашего приложения, чтобы ваши различные модули может ссылаться на этот интерфейс.
Но жизненный цикл статики не очень под вашим контролем; поэтому, чтобы придерживаться модели жизненного цикла, класс приложения должен инициировать и разрушать эти статические объекты в методах onCreate() и onTerminate() класса Application
Стойкие объекты Даже несмотря на то, что приложение, как представляется, продолжает работать, система может захотеть убить свой процесс и перезапустить его позже. Если у вас есть данные, которые вам нужно сохранить от одного вызова активности до следующего, вам нужно представить данные как состояние, которое будет сохранено в результате активности, когда будет сообщено, что оно может исчезнуть.
Для совместного использования сложных постоянных определяемых пользователем объектов рекомендуется использовать следующие подходы:
Application Preferences
Files
contentProviders
SQLite DB
Если общие данные необходимо сохранить в точках, где процесс приложения может быть убит, поместите эти данные в постоянное хранилище, например, в приложения, SQLite DB, Files или ContentProviders. Подробнее о том, как использовать эти компоненты, см. Хранилище данных.