В чём разница между putExtra и putSerializable?
И тот и другой метод передаёт информацию через intent, тогда почему в одном случае используется putExtra, а в другом putSerializable?
Ответы (2 шт):
Между активностями и фрагментами вы можете коммуницировать при помощи Intent и Bundle. Как вам уже было сказано в комментариях у intent нет метода putSerializable. Данный метод есть у bundle. Но если вам нужно передать какой-то serializable объект то вы можете воспользоваться методом putExtra() и в него уже положить свои данные. Есть так же и другой способ передачи serializable в intent - формируете bundle и его кладете в intent при помощи putExtra()
Если танцевать от печки, то первичным является концепция 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 достаточно затратна, поэтому предусмотрены упрощенные способы:
putExtra(String, String/long/int)и.т.д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