2012-03-16 2 views
7

Мне было интересно, почему Google делает это настолько сложным, чтобы передать список объектов вокруг, от одной активности до другой деятельности, хотя мои действия все в рамках одного процесса?Почему так громоздко передавать список объектов из одной деятельности в другую деятельность

Почему они не могут просто иметь что-то вроде

intent.putExtra("histories", listOfHistoryObjects); 

ли они чрезмерно дизайн?

ответ

6

Одна из причин:

  1. активность А начинает активность B, обработка его аргумент, который является прямым указателем на объект.
  2. Пользователь нажимает на дом.
  3. Ваш процесс убит в фоновом режиме.
  4. Пользователь возвращается в ваше приложение.
  5. Деятельность B теперь воссоздана.
  6. Ooops, аргумент объекта, который должен был работать, больше не существует.

Другая причина:

Деятельность являются компонентами верхнего уровня, представляющие основные части вашего приложения. Платформа управляет ими для вас через процессы; независимо от того, работают ли операции А и В в одном и том же процессе, все, что вы предоставляете startActivity(), должно проходить через IPC к системному процессу, а системный процесс поддерживает состояние этого действия и передает его обратно в ваш процесс, когда активность B должен быть создан. Он также поддерживает это при повторном запуске вашего процесса. Он не мог ничего сделать, если бы разрешал любой произвольный объект Java, который нельзя было переносить через границы IPC.

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

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

Также пожалуйста, не использовать Сериализуемое для хранения объектов в посылку или комплект. Как говорится в документации на http://developer.android.com/reference/android/os/Parcel.html#writeSerializable(java.io.Serializable), это чрезвычайно неэффективно по сравнению с реализацией Parcelable (или даже с использованием встроенных примитивов в Bundle).

+0

+1 для вашего списка маркеров, но я должен не соглашаться, когда дело доходит до сериализации объектов в некоторых ситуациях. В основном это зависит от конкретного случая. В некоторых случаях уровень неэффективности пренебрежимо мал, и просто отказаться от подхода не оправдано. – Squonk

+1

Ввод содержимого в комплект поставки, вероятно, будет более эффективным. – hackbod

0

Я думаю, вам просто нужно, чтобы реализовал интерфейс Serializable в вашем классе.

И после этого вы можете прямо написать:

intent.putExtra("histories", listOfHistoryObjects); 

Проверить эту example для подробного описания.

+0

Ссылка мертва. –

+0

@YanChengCHEOK Я только что проверил его ... его работу исправно. –

1

Пока вы остаетесь в одном процессе, вы можете просто передавать объекты по ссылке, используя стандартные java-методы. НЕТ необходимости в намерениях, а контейнер singleton отлично подходит для Android.

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