2010-08-23 4 views
27

Я работаю над небольшим проектом Android, где необходимо разделить некоторые данные между несколькими действиями и службой, которая выполняется в отдельном процессе. Я просто хотел бы узнать, какие у меня варианты с точки зрения обмена данными? Класс приложения? IPC? На основе файлов? Трансляции? Спасибо, ребята!Обмен данными между действиями и услугами

ответ

51

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

Читать онлайн о Broadcastreceiver и о send broadcast

2. Как передавать данные между мероприятиями/услугами в рамках одного приложения?

Это зависит от типа данных, которые вы хотите поделиться:

Примитивные типы данных Для обмена данными между примитивными деятельности/Услуги в приложении, используйте Intent.putExtras(). Для передачи примитивных данных, которые необходимо сохранить, используйте механизм хранения Preferences.

непостоянных объекты Для обмена сложного непостоянного определенного пользователя объекты на короткий срок, рекомендуются следующие подходы:

Класс android.app.Application

андроида .app.Application - базовый класс для тех, кто должен поддерживать состояние глобального приложения. К нему можно получить доступ через getApplication() из любой Activity или Service. Он имеет несколько методов жизненного цикла и будет автоматически создан Android, если вы зарегистрируете его в AndroidManifest.xml.

Публичный статическое поле/метод

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

HashMap лучше из WeakReferences на объекты

Вы также можете использовать HashMap из WeakReferences для объектов с длинными ключами. Когда действие хочет передать объект другому действию, оно просто помещает объект в карту и отправляет ключ (который является уникальным Long на основе счетчика или отметки времени) для активности получателя с помощью дополнительных утилит. Активность получателя извлекает объект с помощью этого ключа.

одноплодной класс

Есть преимущества использования статического Singleton, например, вы можете обратиться к ним без литья getApplication() для класса конкретного приложения, или идти на неприятности висит интерфейс на всех ваших подклассах приложений, чтобы ваши различные модули могли ссылаться на этот интерфейс.

Но жизненный цикл статики не очень под вашим контролем; поэтому соблюдать модели жизненного цикла, класс приложения должен инициировать и разрушить эти статические объекты в OnCreate() и OnTerminate() методу класса Application

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

Для обмена сложного настойчивого определенного пользователя объекты, рекомендуются следующие подходы:

Application Preferences 
Files 
contentProviders 
SQLite DB 

Если разделяемые данные должны быть сохранены по точкам, где процесс подачи заявки может быть убит, а затем поместить эти данные в постоянном хранения, таких как настройки приложений, SQLite DB, Files или ContentProviders. Пожалуйста, обратитесь к Data Storage за дополнительной информацией об использовании этих компонентов.

+1

Вау, большое спасибо за этот очень информативный ответ. – Jack

+1

Зачем тратить столько памяти на абстракции. Разве нет возможности для глобальных данных. Почему java/android ребята тратят столько памяти – mSO

+0

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

Смежные вопросы