Переваги використання Bundle замість прямого Intent putExtra () в Android


79

У своєму додатку для Android я завжди використовую пряму putExtra()функцію Intentкласу для передачі будь-якої кількості значень новій Activity.
Подобається це:

Intent i = new Intent(this, MyActivity.class);
i.putExtra(ID_EXTRA1, "1");
i.putExtra(ID_EXTRA2, "111");
startActivity(i);

Я знаю про BundleAndroid, і я бачив, як люди використовують Bundleдля передачі цінностей новим Activity.
Подобається це:

Intent intent = new Intent(this, MyActivity.class);
Bundle extras = new Bundle();
extras.putString("EXTRA_USERNAME","my_username");
extras.putString("EXTRA_PASSWORD","my_password");
intent.putExtras(extras);
startActivity(intent);

Тут у мене є 2 сумніви.
Чому я повинен використовувати, Bundleякщо я можу передати значення новим Activity, поставивши їх безпосередньо до Intent?
Які переваги використання Bundleзамість прямого Intent putExtra()?

Відповіді:


65

Це мало (якщо є якась різниця). Код, що використовує додатковий пакет, трохи важчий (це не зробить ніякої різниці в будь-якому практичному застосуванні) і трохи простіший в управлінні, будучи більш загальним.

Якщо одного разу ви вирішите, що - перед надсиланням інформації всередині наміру - ви хочете серіалізувати дані до бази даних - буде трохи чистіше мати пакет, який ви зможете серіалізувати, додати до наміру, а потім подати до PendingBundle - все з одним об’єктом.

[оновлення]

Пояснення (через деякі інші відповіді).

Додатки - це додатковий комплект, який може містити кожен намір (але не обов’язково), тому немає альтернативи використання пакета чи його не використання. Ви використовуєте набір в будь-якому випадку.

Перший раз , коли ви використовуєте putExtra, mExtrasрозшарування всередині Наміри инициализируется і все наступні putExtra делеговані йому. Сам набір для вас недоступний (це за задумом, щоб уникнути певних помилок).

putExtras не розміщує ваш пакет всередині Intent. Натомість він копіює його до поточного набору намірів (або створює такий, як і у випадку putExtra). Ось чому він трохи важчий (у вас є два пакети замість одного і ви платите ціну за копіювання).

Суть полягає в тому, що якщо ви використовуєте putExtras, ви все одно не можете отримати доступ до реального пакета всередині наміру. АЛЕ - у вас є копія на все, що ви, можливо, захочете з цим зробити. Начебто продовжуйте копіювати в інший намір (якщо ви надсилаєте багато подібних намірів).


Скажіть, чи використовую я такий код, як цей Intent intent = new Intent (this, MyActivity.class); intent.putExtra (ID_EXTRA1, "1"); Додаткові набори = новий Bundle (); extras.putString ("EXTRA_USERNAME", "my_username"); extras.putString ("EXTRA_PASSWORD", "my_password"); intent.putExtras (додаткові послуги); startActivity (намір); Як я можу отримати доступ до ID_EXTRA1
Vishal Vijay

@VishalVijay, ви можете отримати копію набору додаткових послуг (не оригінального), зателефонувавши getExtras. Обережно, це може повернути нуль.
fdreger

Тож я можу отримати ID_EXTRA1 та додаткові компоненти (пакет) із нової програми активності.
Vishal Vijay

Вибачте, я не міг точно сказати з відповіді на це запитання, але, якщо у мене є намір, який є єдиною метою редагування даних ValueObjects, все, що я роблю, це передавати в індекс якого VO використовувати зі статичних даних ресурс. Оскільки це обов’язково, це слід робити в startActivity(intent, options)або intent.putExtra()? Я знаю, що це можна зробити і те, і інше, але я просто думаю про найкращу практику? Я зазвичай не чіпаю Пачку, передану onCreate, але я недосвідчений, тому шукаю думки.
WORMSS

putExtras (пакет) НЕ делегує початковий намір. Початковий намір має додаткову частину, яка є пакетом.
Лена Бру

17

Додаткова перевага : як тільки дані поміщаються в Пачку, Ви можете надсилати одні й ті самі дані з кількома намірами. (Лише у випадку, слід надіслати кілька намірів).


6

Пакети - це круто, оскільки ви можете легше ізолювати їх створення / читання, отже відокремлюючи код, що обробляє пакети, від коду інтерфейсу користувача.

У більшості випадків це марно, оскільки ви хочете передати найменший можливий обсяг даних (зазвичай лише пару рядків, ідентифікатор ...)


5

Ви можете посилатися на взаємозв'язок між намірами та наборами (Stackoverflow), а також яке значення набору в програмі Android (Stackoverflow) .

Ви можете надіслати декілька даних або купу даних одним пакетом і надіслати їх через Intent. або іншим способом є додавання декількох операторів PutExtra ().

І наскільки я знаю, немає такої важливої ​​різниці.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.