Работа с одинаковыми данными в трех действиях

1

Я не очень разбираюсь в специфических компонентах Android, поэтому я просто не могу получить то, что мне нужно посмотреть.

У меня есть три действия:

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

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

3D-активность позволяет пользователю делать что-то с выбранными объектами

Мое решение - это сделать одну синглтонную модель, которая позволяет действиям получать и сохранять информацию об объектах,

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

Помогите найти эти компоненты ^ пожалуйста

Теги:
android-activity

5 ответов

6

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

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

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

Класс 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

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

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

  • Настройки приложения
  • Файлы
  • contentProviders
  • SQLite DB

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

  • 0
    «... чтобы придерживаться модели жизненного цикла, класс приложения должен инициировать и разрушать эти статические объекты в методах onCreate () и onTerminate () класса приложения» - я согласен с остальной частью поста, но чувствую, что я должен отметить, что метод onTerminate () никогда не вызывается на реальных устройствах (цитата из ссылки на Android): «Этот метод предназначен для использования в эмулируемых средах процессов. Он никогда не будет вызываться на производственном устройстве Android, где процессы удаляются простым их уничтожением; при этом никакой пользовательский код (включая этот обратный вызов) не выполняется ».
1

попробуйте этот способ, пожалуйста,

    Intent i = new Intent(this, YourTragetedActivity.class);

    i.putExtra("value1", "test1");
    i.putExtra("value2", "test2");

    startActivity(i);


   //// On Your TragetedActivity

   getIntent().getStringExtra("value1")
   getIntent().getStringExtra("value2")
1

да, вы можете отправлять данные между действиями с помощью Intents. Используя для этого функцию putExtra(). Если вы хотите передать свои собственные объекты, вам нужно реализовать класс Parcalable.

1

Да, он делает: http://www.remwebdevelopment.com/dev/a33/Passing-Bundles-Around-Activities.html

В принципе, вы можете отправить Bundle или просто использовать функцию putExtra для этого.

1

Нет проблем с использованием singleton для обмена информацией между вашими действиями, особенно если вам нужны эти данные в соответствии со всеми приложениями.

В качестве альтернативы вы можете использовать Intent для передачи данных между Activity - putExtra().

  • 0
    Я думаю, что не самая лучшая идея передавать большие массивы объектов через дополнительные намерения.
  • 0
    Я согласен, но он попросил другие способы передачи данных между Деятельностями, поэтому я дал ему знать. Лично я считаю, что использование синглтона - это лучшее средство для обмена информацией между операциями, если оно используется правильно.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню