Оптимальный обмен данными между activities в Android
Быстрый ответ
Для передачи данных между активностями в большинстве случаев применяются интенты с вложенными параметрами (extras):
intent.putExtra("ключ", "значение");
Для получения этих данных используется следующий код:
String значение = getIntent().getStringExtra("ключ");
Если вам необходимо передать комплексные объекты, прекрасно подойдет механизм Parcelable, он обходит по производительности механизм Serializable:
intent.putExtra("ключ_объекта", new MyObject());
Этот объект можно получить обратно таким образом:
MyObject объект = getIntent().getParcelableExtra("ключ_объекта");
Выбирайте подходящие методы (getStringExtra
, getParcelableExtra
и т.д.) исходя из типа передаваемых данных.
[AsideBanner]
Для серьезных задач: большие объемы данных
Для работы с большими массивами данных у вас в наличии есть SQLite и файлы. SQLite — это своего рода платформа для упорядоченных данных, а файлы подходят для свободного хранения. Для объектно-ориентированного подхода рекомендуется использовать ORM, например, Room.
Использование статических полей для хранения данных может привести к утечкам памяти. В качестве альтернативы рекомендуется использовать статический Singleton pattern, который позволяет избежать этой проблемы.
LiveData может служить индикатором изменений данных благодаря встроенному механизму отслеживания жизненного цикла.
Обмен сложными данными: некоторые стратегии
Паттерн singleton
Singleton — это особый 'избранный' среди паттернов. Вот пример реализации такого класса:
public class DataRepository {
private static DataRepository sInstance;
private ComplexObjectType mData;
private DataRepository() {}
public static DataRepository getInstance() {
if (sInstance == null) {
sInstance = new DataRepository();
}
return sInstance;
}
public ComplexObjectType getData() {
return mData;
}
public void setData(ComplexObjectType data) {
this.mData = data;
}
}
Чтобы получить доступ к данным через singleton, используйте следующий код:
DataRepository.getInstance().setData(new ComplexObjectType());
Управление состоянием при помощи контекста приложения
Грамотное управление контекстом — это настоящее искусство. Вы можете создать свой класс, расширяющий android.app.Application
, но будьте внимательны и избегайте возможных утечек памяти.
Борьба с утечками памяти
WeakReferences
позволяют избежать утечек памяти, давая возможность сборщику мусора очищать объекты, на которые уже нет статических ссылок.
private WeakReference<Context> mContextRef;
Способы постоянного обмена данными
Данные могут сохраняться на протяжении всего цикла жизни приложения, например, с помощью SharedPreferences. Для работы со сложными структурами данных рекомендуется использовать SQLite или Room.
SharedPreferences sharedPref = getSharedPreferences("app_data", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putString("ключ", "значение");
editor.apply();
Чтобы получить данные, используйте следующий код:
String значение = sharedPref.getString("ключ", "значение_по_умолчанию");
Визуализация
Представьте активности как комнаты в доме, а данные — как ключи. Иллюстрация процесса передачи ключа:
🚪🔑🚶♂️➡️🚪 (Передаем ключ из одной активности в другую)
Различные типы данных:
- Intent: Простой и крайне эффективный
🔑📬
- Singleton: Централизованный ключ
🔑🌐
- SharedPreferences: Надежное хранилище
🔑🧱
- ContentProvider: Контролируемый доступ
🔑🏦
- Класс Application: Всеобъемлющий
🔑🧳
Ключевые идеи для запоминания
Компоненты, осведомленные о жизненном цикле
Компоненты, осведомленные о жизненном цикле активности, уменьшают связанные с ним риски. Примерами могут служить такие компоненты, как ViewModels и LiveData.
Оптимизация производительности
Для улучшения производительности старайтесь избегать лишних геттеров/сеттеров и имейте в виду, что Android передает данные по ссылке, а не по значению.
Стратегия прежде всего
Выбирайте способ обмена данными в зависимости от их размера и сложности. Для каждой задачи существует оптимальное решение.
Оставайтесь в курсе обновленных практик
Регулярно обновляйтесь и следите за обновлениями в документации Android, чтобы быть в курсе последних рекомендаций по лучшим практикам и оптимизации производительности.
Полезные материалы
- Общение с фрагментами | Разработчики Android
- Intents и фильтры intent | Разработчики Android
- Как передавать данные между активностями в Android-приложении? – Stack Overflow
- SharedPreferences | Разработчики Android
- Правильное управление вашей SQLite базой данных | Android Design Patterns
- Жизненный цикл Android-приложения и активности – Учебник
- Документация EventBus – Open Source by greenrobot