Działki i pakiety

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.