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()?

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


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


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


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.