Zalety używania Bundle zamiast bezpośredniego zamiaru putExtra () w Androidzie

79

W mojej aplikacji na Androida zawsze używam bezpośredniej putExtra()funkcji Intentklasy do przekazywania dowolnej liczby wartości do new Activity.
Lubię to:

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

Wiem o BundleAndroidzie i widziałem, jak ludzie używają Bundledo przekazywania wartości nowym Activity.
Lubię to:

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);

Tutaj mam 2 wątpliwości.
Dlaczego powinienem używać, Bundlejeśli mogę przekazywać wartości do new Activity, umieszczając je bezpośrednio Intent?
Jakie są zalety używania Bundlezamiast bezpośredniego Intent putExtra()?

Vishal Vijay
źródło

Odpowiedzi:

65

To niewiele (jeśli jakakolwiek różnica). Kod wykorzystujący dodatkowy pakiet jest nieco cięższy (nie ma to znaczenia w żadnym praktycznym zastosowaniu) i nieco łatwiejszy w zarządzaniu, będąc bardziej ogólnym.

Jeśli pewnego dnia zdecydujesz, że - przed wysłaniem informacji wewnątrz intencji - chcesz serializować dane do bazy danych - będzie nieco czystszy pakiet, który możesz serializować, dodać do intencji, a następnie przesłać do PendingBundle - wszystko jednym przedmiotem.

[aktualizacja]

Wyjaśnienie (z powodu innych odpowiedzi).

Dodatki to dodatkowy pakiet, który może zawierać każda intencja (ale nie musi), więc nie ma alternatywy między używaniem pakietu lub jego nieużywaniem. W obu przypadkach używasz pakietu.

Przy pierwszym użyciu putExtra, A mExtraswiązka wewnątrz Intent jest inicjowany i wszystkie następujące putExtra są delegowane do niego. Sam pakiet jest dla Ciebie niedostępny (jest to zgodne z projektem, aby uniknąć pewnych rodzajów błędów).

putExtras nie umieszcza twojego pakietu w intencji. Zamiast tego kopiuje go do bieżącego pakietu intencji (lub tworzy go, jak w przypadku putExtra). Dlatego jest nieco cięższy (masz dwa pakiety zamiast jednego i płacisz cenę kopiowania).

Sedno polega na tym, że jeśli używasz putExtras, nadal nie możesz uzyskać dostępu do prawdziwego pakietu wewnątrz intencji. ALE - masz kopię na wszystko, co chcesz z nią zrobić. Na przykład trzymaj się, aby skopiować do innej intencji (jeśli wyślesz wiele podobnych intencji).

fdreger
źródło
Powiedz mi, czy używam kodu takiego jak ten Intent intent = new Intent (this, MyActivity.class); intent.putExtra (ID_EXTRA1, "1"); Dodatki do pakietu = nowy Bundle (); extras.putString ("EXTRA_USERNAME", "my_username"); extras.putString ("EXTRA_PASSWORD", "my_password"); intent.putExtras (dodatki); startActivity (intencja); Jak mogę uzyskać dostęp do ID_EXTRA1
Vishal Vijay
@VishalVijay, możesz otrzymać kopię pakietu dodatków (nie oryginalnego), dzwoniąc do getExtras. Ostrożnie, może zwrócić zero.
fdreger
Więc mogę uzyskać ID_EXTRA1 i dodatki (pakiet) z nowego rigt aktywności.
Vishal Vijay
Przykro mi, nie mogłem do końca stwierdzić z odpowiedzi na to pytanie, ale jeśli mam zamiar, który służy wyłącznie do edycji danych ValueObjects, wszystko, co robię, to przekazanie indeksu, którego VO użyć z danych statycznych ratunek. Ponieważ jest to obowiązkowe, należy to zrobić w startActivity(intent, options)lub intent.putExtra()? Wiem, że można to zrobić i jedno i drugie, ale myślę tylko o najlepszej praktyce? Zwykle nie dotykam pakietu przekazanego do onCreate, ale jestem niedoświadczony, więc szukam opinii.
WORMSS
putExtras (pakiet) NIE deleguje do pierwotnego celu. Oryginalna intencja ma dodatek, który jest pakietem.
Lena Bru
17

Dodatkowa zaleta : po umieszczeniu danych w paczce możesz wysłać te same dane wieloma celami. (Tylko w tym przypadku należy wysłać kilka intencji).

vanguard69
źródło
6

Pakiety są fajne, ponieważ można łatwiej izolować ich tworzenie / odczytywanie, oddzielając w ten sposób kod obsługujący pakiety od kodu interfejsu użytkownika.

W większości przypadków jest to bezużyteczne, ponieważ będziesz chciał przesłać jak najmniejszą ilość danych (zwykle tylko kilka ciągów, identyfikator ...)

njzk2
źródło