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

79

В моем приложении для Android я всегда использую прямую putExtra()функцию Intentкласса, чтобы передать любое количество значений в new 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 - все с одним объектом.

[Обновить]

Разъяснение (из-за некоторых других ответов).

Extras - это дополнительный пакет, который может содержать каждое намерение (но не обязательно), поэтому нет альтернативы между использованием пакета или его неиспользованием. В любом случае вы используете комплект.

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

putExtras не помещает ваш пакет в Intent. Вместо этого он копирует его в текущий пакет намерений (или создает его, как в случае с putExtra). Вот почему он немного тяжелее (у вас есть два пакета вместо одного, и вы платите за копирование).

Суть в том, что если вы используете putExtras, вы все равно не можете получить доступ к настоящему пакету внутри намерения. НО - у вас есть копия для всего, что вы можете с ней делать. Например, старайтесь копировать в другое намерение (если вы отправляете много похожих намерений).

фдрегер
источник
Скажите, использую ли я такой код, как Intent intent = new Intent (this, MyActivity.class); intent.putExtra (ID_EXTRA1, "1"); Дополнения к пакету = новый пакет (); extras.putString («ИМЯ_ПОЛЬЗОВАТЕЛЯ», «имя_пользователя»); extras.putString ("EXTRA_PASSWORD", "my_password"); intent.putExtras (дополнительные услуги); startActivity (намерение); Как я могу получить доступ к ID_EXTRA1
Вишал Виджай
@VishalVijay, вы можете получить копию пакета дополнений (не оригинала), вызвав getExtras. Осторожно, он может вернуть значение null.
fdreger
Таким образом, я могу получить ID_EXTRA1 и дополнения (пакет) из нового правого действия.
Vishal Vijay
Извините, я не мог точно сказать из ответа на этот вопрос, но, если у меня есть намерение, которое является единственной целью редактирования данных ValueObjects, все, что я делаю, это передаю индекс, какой VO использовать из статических данных ресурс. Поскольку это обязательно должно быть сделано в startActivity(intent, options)или intent.putExtra()? Я знаю, что можно сделать и то, и другое, но я просто думаю о лучших практиках? Обычно я не трогаю пакет, переданный onCreate, но у меня нет опыта, поэтому я ищу мнения.
WORMSS
putExtras (bundle) НЕ делегирует исходное намерение. У исходного намерения есть дополнительный элемент - связка.
Лена Брю
17

Дополнительное преимущество : после того, как данные помещены в Bundle, вы можете отправлять одни и те же данные с помощью нескольких целей. (Только в случае отправки нескольких намерений).

авангард69
источник
6

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

В большинстве случаев это бесполезно, так как вы захотите передать минимально возможное количество данных (обычно всего пару строк, идентификатор ...)

njzk2
источник
5

вы можете сослаться на намерение и связь между пакетами (Stackoverflow), а также Какова важность пакета в программе Android (Stackoverflow) .

вы можете отправить несколько или несколько данных в одном пакете и отправить их через Intent. или другой способ - добавить несколько операторов PutExtra ().

И, насколько мне известно, такой важной разницы нет.

Махавир Мутта
источник