Mam scenariusz, w którym po zalogowaniu za pośrednictwem strony logowania button
na każdym z nich nastąpi wylogowanie activity
.
Po kliknięciu sign-out
przekażę session id
zalogowanego użytkownika do wylogowania. Czy ktoś może poprowadzić mnie, jak zapewnić session id
dostępność dla wszystkich activities
?
Każda alternatywa dla tej sprawy
Odpowiedzi:
Najłatwiej to zrobić, przekazując identyfikator sesji do działania wylogowania w używanym
Intent
do uruchomienia działania:Uzyskaj dostęp do zamiaru następnej aktywności:
W docs dla zamiarów ma więcej informacji (zobacz w sekcji „Dodatki”).
źródło
Long session_ids=getIntent().getExtras().getLong("EXTRA_SESSION_IDS");
setData
i jaka jest różnica między tymi dwoma podejściami? Który jest lepszy?W bieżącej działalności utwórz nową
Intent
:Następnie w nowym działaniu pobierz te wartości:
Użyj tej techniki, aby przekazywać zmienne z jednego działania do drugiego.
źródło
extras.getInt("new_variable_name")
. Jeśli spróbujesz uzyskać go za pośrednictwemgetString()
Androida, sprawdź, czy podano int i zwraca null!startActivity(i);
? Mam na myśli, czy mogę wykonać działanie A wywołać działanie B , a to zwróci dane do działania A ? jestem zdezorientowany?Dodatek Passing Intent to dobre podejście, jak zauważył Erich.
Obiekt aplikacji jest jednak innym sposobem, a czasem jest łatwiejszy w radzeniu sobie z tym samym stanem w wielu działaniach (w przeciwieństwie do konieczności pobierania / umieszczania go wszędzie) lub obiektami bardziej złożonymi niż operacje podstawowe i ciągi.
Możesz rozszerzyć aplikację, a następnie ustawić / uzyskać cokolwiek tam chcesz i uzyskać do niej dostęp z dowolnego działania (w tej samej aplikacji) za pomocą getApplication () .
Pamiętaj również, że inne podejścia, które możesz zobaczyć, takie jak statyka, mogą być problematyczne, ponieważ mogą prowadzić do wycieków pamięci . Aplikacja pomaga również rozwiązać ten problem.
źródło
Klasa źródłowa:
Klasa docelowa (klasa NewActivity):
źródło
Musisz tylko wysłać dodatki, dzwoniąc w zamiar.
Lubię to:
Teraz
OnCreate
metodąSecondActivity
możesz pobrać dodatki w ten sposób.Jeśli przesłana wartość była w
long
:Jeśli przesłana wartość to
String
:Jeśli przesłana wartość to
Boolean
:źródło
boolean
ilong
pobierający, którzy warto komentować IMO, a nie odpowiedź.Pomaga mi widzieć rzeczy w kontekście. Oto dwa przykłady.
Przekazywanie danych do przodu
Główna aktywność
startActivity
.MainActivity.java
Druga aktywność
getIntent()
tego,Intent
aby rozpocząć drugą aktywność. Następnie możesz wyodrębnić danegetExtras()
i klucz zdefiniowany w pierwszym działaniu. Ponieważ nasze dane są ciągiem, będziemy ichgetStringExtra
tutaj używać .SecondActivity.java
Przekazywanie danych z powrotem
Główna aktywność
startActivityForResult
, podając dowolny kod wyniku.onActivityResult
. Jest to wywoływane po zakończeniu drugiego działania. Możesz upewnić się, że tak naprawdę jest to drugie działanie, sprawdzając kod wyniku. (Jest to przydatne, gdy zaczynasz wiele różnych działań od tego samego działania głównego).Intent
. Dane są wyodrębniane przy użyciu pary klucz-wartość. Mógłbym użyć dowolnego ciągu dla klucza, ale użyję predefiniowanego,Intent.EXTRA_TEXT
ponieważ wysyłam tekst.MainActivity.java
Druga aktywność
Intent
. Dane są przechowywane przyIntent
użyciu pary klucz-wartość. Zdecydowałem się użyćIntent.EXTRA_TEXT
dla mojego klucza.RESULT_OK
i dodaj zamiar przechowywania danych.finish()
aby zamknąć drugie działanie.SecondActivity.java
źródło
Zaktualizowano Uwaga, że wspomniałem o użyciu SharedPreference . Ma prosty interfejs API i jest dostępny we wszystkich działaniach aplikacji. Ale jest to niezdarne rozwiązanie i stanowi zagrożenie dla bezpieczeństwa, jeśli przekazujesz wrażliwe dane. Najlepiej używać zamiarów. Ma obszerną listę przeciążonych metod, które można wykorzystać do lepszego przenoszenia wielu różnych typów danych między działaniami. Spójrz na intent.putExtra . Ten link dość dobrze prezentuje użycie putExtra.
W przekazywaniu danych między działaniami moim preferowanym podejściem jest stworzenie statycznej metody dla odpowiedniego działania, która zawiera wymagane parametry, aby uruchomić zamiar. Który następnie zapewnia łatwą konfigurację i pobieranie parametrów. Więc może tak wyglądać
Następnie możesz utworzyć zamiar zamierzonego działania i upewnić się, że masz wszystkie parametry. Możesz dostosować fragmenty do. Prosty przykład powyżej, ale masz pomysł.
źródło
Spróbuj wykonać następujące czynności:
Utwórz prostą klasę „pomocnika” (fabryka dla swoich zamiarów), jak poniżej:
To będzie fabryka dla wszystkich twoich zamiarów. Za każdym razem, gdy potrzebujesz nowej intencji, utwórz statyczną metodę fabryczną w IntentHelper. Aby utworzyć nową intencję, powinieneś po prostu powiedzieć to w ten sposób:
W twojej działalności Jeśli chcesz „zapisać” niektóre dane w „sesji”, skorzystaj z następujących opcji:
I wyślij ten zamiar. W działaniu docelowym twoje pole będzie dostępne jako:
Więc teraz możemy używać Intent jak tej samej starej sesji (jak w serwletach lub JSP ).
źródło
Możesz także przekazywać obiekty klasy niestandardowej, tworząc klasę paczkowalną . Najlepszym sposobem na uczynienie go paczkowym jest napisanie swojej klasy, a następnie po prostu wklejenie jej do strony takiej jak http://www.parcelabler.com/ . Kliknij kompilację, a otrzymasz nowy kod. Skopiuj wszystko i zastąp oryginalną zawartość klasy. Następnie-
i uzyskaj wynik w NextActivity jak-
Teraz możesz po prostu użyć obiektu foo, tak jak byś tego użył.
źródło
Innym sposobem jest użycie publicznego pola statycznego, w którym przechowujesz dane, tj .:
źródło
Najwygodniejszym sposobem przekazywania danych między działaniami jest przekazywanie zamiarów. W pierwszym działaniu, z którego chcesz wysłać dane, dodaj kod,
Powinieneś również zaimportować
Następnie w następnym Acitvity (SecondActivity) powinieneś pobrać dane z intencji za pomocą następującego kodu.
źródło
Możesz użyć
SharedPreferences
...Logowanie. Identyfikator sesji magazynu czasu w
SharedPreferences
Wyloguj się. Identyfikator sesji pobierania czasu we wspólnych preferencjach
Jeśli nie masz wymaganego identyfikatora sesji, usuń preferencje udostępnione:
Jest to bardzo przydatne, ponieważ jeden raz zapisujesz wartość, a następnie odzyskujesz dowolne miejsce aktywności.
źródło
Standardowe podejście.
Teraz w drugiej aktywności pobierz dane z pakietu:
Zdobądź pakiet
Wyodrębnij dane…
źródło
i.putExtras()
/,getIntent().getString()
który jest proponowany przez 6 innych odpowiedzi ...Z działalności
Do działania
źródło
Bundle
Podejście oparte zostało już zaproponowane przez PRABEESH RK w 2012 r. I Ajay Venugopal , Krishna . I może być zredukowany doi.putExtras()
/,getIntent().getString()
który jest proponowany przez 8 innych odpowiedzi ...Możesz wysyłać dane między działaniami za pomocą obiektu docelowego. Rozważ, że masz dwie czynności, mianowicie
FirstActivity
iSecondActivity
.Inside FirstActivity:
Za pomocą zamiaru:
Inside SecondActivity
Teraz możesz używać różnych metod klas pakietów, aby uzyskać wartości przekazywane z FirstActivity według klucza.
Np
bundle.getString("key")
,bundle.getDouble("key")
,bundle.getInt("key")
itd.źródło
Bundle
Podejście oparte zostało już zaproponowane przez PRABEESH RK w 2012 r. I Ajay Venugopal . I może być zredukowany doi.putExtras()
/,getIntent().getString()
który jest proponowany przez 7 innych odpowiedzi ...Jeśli chcesz przenieść bitmapę między Aktywnościami / Fragmentami
Czynność
Aby przekazać bitmapę między Aktywnościami
I w klasie Activity
Fragment
Aby przekazać bitmapę między fragmentami
Aby otrzymać wewnątrz SecondFragment
Przesyłanie dużych bitmap
Jeśli otrzymujesz nieudaną transakcję wiążącą, oznacza to, że przekraczasz bufor transakcji wiążącej, przenosząc duży element z jednego działania do drugiego.
W takim przypadku musisz skompresować mapę bitową jako tablicę bajtów, a następnie rozpakować ją w innej czynności , takiej jak ta
W FirstActivity
I w SecondActivity
źródło
Możesz odzyskać go w innym działaniu. Dwie drogi:
Drugi sposób to:
źródło
Oto moja najlepsza praktyka i bardzo pomaga, gdy projekt jest ogromny i złożony.
Załóżmy, że mam 2 działania,
LoginActivity
iHomeActivity
. Chcę przekazać 2 parametry (nazwa użytkownika i hasło) odLoginActivity
doHomeActivity
.Najpierw tworzę moje
HomeIntent
Oto jak przekazuję dane w mojej LoginActivity
Ostatni krok, oto jak otrzymuję dane
HomeActivity
Gotowy! Fajnie :) Chcę tylko podzielić się swoim doświadczeniem. Jeśli pracujesz nad małym projektem, nie powinien to być duży problem. Ale kiedy pracujesz nad dużym projektem, to naprawdę boli, gdy chcesz dokonać refaktoryzacji lub naprawy błędów.
źródło
Dodatkowa odpowiedź: konwencje nazewnictwa dla ciągu klucza
Odpowiedzi na faktyczny proces przekazywania danych zostały już udzielone, jednak w większości odpowiedzi użyto zakodowanych ciągów znaków dla nazwy klucza w zamiarze. Zwykle jest to w porządku, gdy jest używane tylko w aplikacji. Jednak dokumentacja zaleca stosowanie
EXTRA_*
stałych dla standardowych typów danych.Przykład 1: Używanie
Intent.EXTRA_*
kluczyPierwsza aktywność
Druga aktywność:
Przykład 2: Definiowanie własnego
static final
kluczaJeśli jeden z
Intent.EXTRA_*
Ciągów nie odpowiada Twoim potrzebom, możesz zdefiniować własny na początku pierwszej aktywności.Dołączenie nazwy pakietu to tylko konwencja, jeśli używasz tylko klucza we własnej aplikacji. Konieczne jest jednak unikanie konfliktów nazw, jeśli tworzysz jakąś usługę, którą inne aplikacje mogą wywoływać z zamiarem.
Pierwsza aktywność:
Druga aktywność:
Przykład 3: Korzystanie z klucza zasobu String
Chociaż nie wspomniano w dokumentacji, ta odpowiedź zaleca użycie zasobu String, aby uniknąć zależności między działaniami.
strings.xml
Pierwsza aktywność
Druga aktywność
źródło
Możesz użyć
Intent
Innym sposobem może być również użycie wzorca singletonu :
Z Twojej FirstActivity
Na SecondActivity
źródło
Przekazywanie danych między czynnościami odbywa się głównie za pomocą obiektu celowego.
Najpierw musisz dołączyć dane do obiektu docelowego za pomocą
Bundle
klasy. Następnie wywołaj działanie przy użyciu jednej z metodstartActivity()
lubstartActivityForResult()
.Możesz znaleźć więcej informacji na ten temat, na przykład z wpisu na blogu Przekazywanie danych do działania .
źródło
Intent#putExtra()
). Ale dodaje kolejnyBundle
i komplikuje sprawy.Możesz wypróbować Preferencje wspólne, może to być dobra alternatywa dla udostępniania danych między działaniami
Aby zapisać identyfikator sesji -
Aby je zdobyć -
źródło
Rozpocznij kolejną czynność od tego parametru przekazywania parametrów poprzez Obiekt pakietu
Pobierz inną aktywność (YourActivity)
Jest to odpowiednie dla prostego rodzaju danych. Ale jeśli chcesz przesyłać złożone dane pomiędzy działaniami, najpierw musisz je serializować.
Tutaj mamy model pracownika
Możesz użyć biblioteki Gson lib dostarczonej przez Google do serializacji złożonych danych w ten sposób
źródło
Kotlin
Przejdź od pierwszej aktywności
Wejdź w drugą aktywność
Sugestia
Zawsze przechowuj klucze w stałym pliku, aby lepiej zarządzać.
źródło
źródło
Charlie Collins dał mi idealną odpowiedź za pomocą
Application.class
. Nie zdawałem sobie sprawy, że możemy to tak łatwo podklasować. Oto uproszczony przykład z wykorzystaniem niestandardowej klasy aplikacji.AndroidManifest.xml
Podaj
android:name
atrybut, aby użyć własnej klasy aplikacji.MyApplication.java
Użyj tego jako globalnego uchwytu referencyjnego. Działa dobrze w ramach tego samego procesu.
MainActivity.java
Ustaw globalne odwołanie „singleton” do instancji aplikacji.
MyPreferences.java
Prosty przykład, w którym używam głównego działania z innej instancji działania.
źródło
Niedawno wydałem Vapor API , platformę Android o smaku jQuery, która upraszcza wszelkiego rodzaju zadania. Jak wspomniano,
SharedPreferences
jest to jeden ze sposobów, w jaki możesz to zrobić.VaporSharedPreferences
jest zaimplementowany jako Singleton, więc jest to jedna opcja, a w Vapor API ma mocno przeciążoną.put(...)
metodę, więc nie musisz jawnie martwić się o typ danych, który popełniasz - pod warunkiem, że jest obsługiwany. Jest również płynny, więc możesz łączyć połączenia:Opcjonalnie automatycznie zapisuje zmiany i ujednolica proces czytania i pisania pod maską, dzięki czemu nie trzeba jawnie pobierać edytora, tak jak w standardowym Androidzie.
Alternatywnie możesz użyć
Intent
. W interfejsie API Vapor można również użyć.put(...)
metody przeciążalności łańcuchowej naVaporIntent
:I przekaż to jako dodatek, jak wspomniano w innych odpowiedziach. Możesz pobrać dodatki ze swojego konta
Activity
, a ponadto, jeśli używasz, jestVaporActivity
to zrobione automatycznie, dzięki czemu możesz użyć:Aby je odzyskać na drugim końcu, w
Activity
którym się przełączasz.Mam nadzieję, że niektórzy są zainteresowani :)
źródło
Pierwsza aktywność:
Druga aktywność:
źródło
Możesz przesyłać dane między czynnościami w aplikacji na 3 sposoby
przekazywanie danych w sposób zamierzony ma pewien limit. W przypadku dużej ilości danych można korzystać z udostępniania danych na poziomie aplikacji, a przechowywanie ich w SharedPreference powoduje zwiększenie rozmiaru aplikacji
źródło
Użyj klasy globalnej:
Możesz zadzwonić do seterów i autorów tej klasy ze wszystkich innych klas. Zrób to, musisz utworzyć obiekt GlobalClass w każdym Actitity:
Następnie możesz zadzwonić na przykład:
źródło