В чём разница между putExtra и putSerializable?

И тот и другой метод передаёт информацию через intent, тогда почему в одном случае используется putExtra, а в другом putSerializable?


Ответы (2 шт):

Автор решения: Andrew

Между активностями и фрагментами вы можете коммуницировать при помощи Intent и Bundle. Как вам уже было сказано в комментариях у intent нет метода putSerializable. Данный метод есть у bundle. Но если вам нужно передать какой-то serializable объект то вы можете воспользоваться методом putExtra() и в него уже положить свои данные. Есть так же и другой способ передачи serializable в intent - формируете bundle и его кладете в intent при помощи putExtra()

→ Ссылка
Автор решения: Barmaley Red Star

Если танцевать от печки, то первичным является концепция Parcel - по сути это специальный способ сериализации (если точнее механизм IPC) применяемый в Android. На техническом уровне, нужно имплементировать интерфейс Parcelable. Документация говорит:

Parcel is not a general-purpose serialization mechanism. This class (and the corresponding Parcelable API for placing arbitrary objects into a Parcel) is designed as a high-performance IPC transport.

Однако, в плане кода реализация Parcel/Parcelable достаточно затратна, поэтому предусмотрены упрощенные способы:

  1. putExtra(String, String/long/int) и.т.д
  2. putExtra(String, Bundle) - где Bundle - пакет, который может содержать в.т.ч Serializable/String/int/long/Parcelable и проч.

При этом важно понимать, что под капотом все равно лежит Parcel/Parcelable

Например putExtra(String, boolean) под капотом (в исходниках) выглядит так:

public Intent putExtra(String name, boolean value) {
    if (mExtras == null) {
        mExtras = new Bundle();
    }
    mExtras.putBoolean(name, value);
    return this;
}

То есть по сути все значения все равно упаковываются в Bundle, а если начать раскручивать Bundle, то там выглядывают рожки от Parcelable

→ Ссылка