Передача обьекта в Activity
от Naik
Иногда возникает такая ситуация, что перед вызовом второй Activity нужно сначала передать туда какой-то обьект, без которого вторая Activity не может работать. У меня в первой активности отображается список уровней игры. Уровень представляет собой класс, в котором хранится InputStream, через который читается сначала название, размер уровня, а при выборе подгружается карта и другие данные. Поэтому второй активности, которая реализует игровой процесс, нужно как-то получить этот уровень.
Способ 1, простой
Проще всего во второй активности создать статический метод и обьекты, например:
Код первой
Вторая:
Недостатки: нужно все время помнить о необходимости вызова метода первоначальной инициализации, обьект должен быть статичным, код получается непонятным и запутанным.
Второй способ, сложный
Можно использовать сериализацию, имплементировав интерфейс Serializable или Parcelable (говорят второй в разы быстрее), записывая и читая все поля обьекта для сохранения/восстановления соответственно. Нужно будет после любого изменения передаваемого обьекта, править его методы сериализации, к тому же, по сути, создаются новый обьект с тем самым содержанием, а не восстанавливается, поэтому меняется его адрес (ссылка) и состояние. Это приемлемо только для текстовых данных и примитивов.
Для других случаев есть интерфейс IBinder. Он не используется напрямую, а используется его реализация Binder. Предназначен для взаимодействия разных элементов приложения (Service, Activity). Привожу реализацию вспомогательного класса, который позволяет передавать обьекты в одну строчку
Пример использования:
Код первой Activity
Вторая:
Update
Собрал Android бибилиотеку на основе этого кода: parcelablebinder.aar
Положите ее в папку libs модуля проекта AndroidStudio, и в build.gradle проекта добавьте локальный репозиторий-папку:
Пример получившегося файла:
Теперь можно подключить библиотеку, по имени файла в скрипте build.gradle модуля:
Пример файла:
Надеюсь код кому-нибудь пригодится. На этом все, удачи
Способ 1, простой
Проще всего во второй активности создать статический метод и обьекты, например:
Код первой
- // Когда выбрали нужный уровень
- GameActivity.preInit(levels.get(n));
- Intent i = new Intent(ctx, GameActivity.class);
- startActivityForResult(i, 0);
Вторая:
- static Level level;
- public static void init(Level l) {
- level = l;
- }
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- // отображаем уровень игры
- }
Недостатки: нужно все время помнить о необходимости вызова метода первоначальной инициализации, обьект должен быть статичным, код получается непонятным и запутанным.
Второй способ, сложный
Можно использовать сериализацию, имплементировав интерфейс Serializable или Parcelable (говорят второй в разы быстрее), записывая и читая все поля обьекта для сохранения/восстановления соответственно. Нужно будет после любого изменения передаваемого обьекта, править его методы сериализации, к тому же, по сути, создаются новый обьект с тем самым содержанием, а не восстанавливается, поэтому меняется его адрес (ссылка) и состояние. Это приемлемо только для текстовых данных и примитивов.
Для других случаев есть интерфейс IBinder. Он не используется напрямую, а используется его реализация Binder. Предназначен для взаимодействия разных элементов приложения (Service, Activity). Привожу реализацию вспомогательного класса, который позволяет передавать обьекты в одну строчку
Открыть спойлер
Пример использования:
Код первой Activity
- // Когда выбрали нужный уровень
- Intent i = new Intent(ctx, GameActivity.class);
- i.putExtra("level", new ParcelableBinder<Level>(levels.get(n)));
- startActivityForResult(i, 0);
Вторая:
- Level level;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- level = ((ParcelableBinder<Level>)getIntent().getParcelableExtra("level")).getObj();
- // отображаем уровень игры
- }
Update
Собрал Android бибилиотеку на основе этого кода: parcelablebinder.aar
Положите ее в папку libs модуля проекта AndroidStudio, и в build.gradle проекта добавьте локальный репозиторий-папку:
- flatDir {
- dirs 'libs'
- }
Открыть спойлер
Теперь можно подключить библиотеку, по имени файла в скрипте build.gradle модуля:
- dependencies {
- compile (name: 'parcelablebinder', ext: 'aar')
- }
Открыть спойлер
Надеюсь код кому-нибудь пригодится. На этом все, удачи