Obiekty Parcelable
i Bundle
powinny być
używane poza granicami procesów, np. w IPC/Binder
transakcji między działaniami z intencjami, a także do przechowywania stanu przejściowych w różnych konfiguracjach,
zmian. Na tej stronie znajdziesz zalecenia i sprawdzone metody
Parcelable
i Bundle
obiektów.
Uwaga: Parcel
nie jest ogólnym przeznaczeniem.
i nie należy nigdy
przechowywać dowolne dane Parcel
na dysku lub wysyłać je przez sieć.
Wysyłanie danych między działaniami
Gdy aplikacja tworzy obiekt Intent
do użycia
startActivity(android.content.Intent)
podczas rozpoczynania nowej aktywności,
mogą być przesyłane przez aplikację
za pomocą parametru putExtra(java.lang.String, java.lang.String)
.
Fragment kodu poniżej pokazuje przykładowy sposób wykonania tej operacji.
Kotlin
val intent = Intent(this, MyActivity::class.java).apply { putExtra("media_id", "a1b2c3") // ... } startActivity(intent)
Java
Intent intent = new Intent(this, MyActivity.class); intent.putExtra("media_id", "a1b2c3"); // ... startActivity(intent);
System operacyjny grupuje bazowy element Bundle
intencji. Następnie system operacyjny tworzy
nową aktywność,
wyodrębnia dane i przekazuje intencję do nowego działania.
Zalecamy użycie klasy Bundle
do ustawiania elementów podstawowych znanych systemowi operacyjnemu
Intent
obiektów. Klasa Bundle
jest bardzo popularna
zoptymalizowane pod kątem rządzenia i usuwania skutków przesyłek.
W niektórych przypadkach możesz potrzebować mechanizmu do przesyłania obiektów złożonych lub złożonych między działaniami.
W takich przypadkach klasa niestandardowa powinna implementować interfejs Parcelable i dostarczać odpowiednie wartości
Metoda writeToParcel(android.os.Parcel, int)
.
Musi też zawierać niepuste pole o nazwie CREATOR
, które
implementuje interfejs Parcelable.Creator
, którego
createFromParcel()
jest używana do konwertowania Parcel
z powrotem na bieżący obiekt.
Aby dowiedzieć się więcej,
zapoznaj się z dokumentacją obiektu Parcelable
.
Gdy wysyłasz dane za pośrednictwem intencji, pamiętaj, aby ograniczyć rozmiar danych do kilku kB.
Wysłanie zbyt dużej ilości danych może spowodować, że system wygeneruje
TransactionTooLargeException
wyjątek.
Wysyłanie danych między procesami
Przesyłanie danych między procesami jest podobne do przesyłania danych między działaniami. Jednak podczas wysyłania
między procesami, nie zalecamy korzystania z pakietów niestandardowych. Jeśli wyślesz niestandardowy
Parcelable
z jednej aplikacji do drugiej. Musisz upewnić się, że klucz
dokładnie ta sama wersja klasy niestandardowej to
zarówno w aplikacjach wysyłających, jak i odbieranych. Zwykle jest to popularna biblioteka
używane w obu aplikacjach. Jeśli aplikacja próbuje wysłać niestandardowy pakiet do
ponieważ nie jest w stanie usunąć z organizacji klas, o których nie ma pojęcia.
Aplikacja może na przykład ustawić alarm przy użyciu:
klasy AlarmManager
i użyj niestandardowej reguły Parcelable
na podstawie zamiaru alarmu. Po uruchomieniu alarmu system modyfikuje intencje
Bundle
materiałów dodatkowych do dodania
i powtórzyć liczbę. Ta modyfikacja może spowodować usunięcie parametru niestandardowego przez system
Parcelable
z dodatków. To z kolei może spowodować, że aplikacja
ulega awarii po otrzymaniu zmodyfikowanej intencji alarmu, ponieważ
aby otrzymywać dodatkowe dane, których już nie ma.
Bufor transakcji Binder ma ograniczony, stały rozmiar, obecnie 1 MB, który jest wspólny dla wszystkich transakcji w toku. Ten limit jest w trakcie przetwarzania na poziomie aktywności, a nie na poziomie aktywności, te transakcje obejmują wszystkie aplikację, taką jak onSaveInstanceState, startActivity i wszelkie interakcje z systemem. Kiedy rozmiar został przekroczony limit, więc został zgłoszony TransactionTooLargeException.
W konkretnym przypadku zapisanego stanu instancji ilość danych powinna być niewielka. ponieważ proces systemowy musi przechowywać udostępniane dane tak długo, jak użytkownik może wrócić do tej czynności (nawet jeśli proces działania zostanie zatrzymany). Zalecamy, aby zapisany stan nie przekraczał 50 tys. danych.
Uwaga: w Androidzie 7.0 (poziom interfejsu API 24) i nowszych system zgłasza żądanie TransactionTooLargeException jako wyjątek środowiska wykonawczego. W starszych wersjach Androida system wyświetla ostrzeżenie tylko w dzienniku logcat.