Migracja implementacji ekranu powitalnego na Androida 12 lub nowszego

Jeśli zaimplementujesz niestandardowy ekran powitalny w Androidzie 11 lub starszym, przenieś aplikację do interfejsu SplashScreen API, aby mieć pewność, że będzie się prawidłowo wyświetlać na Androidzie 12 i nowszych.

Począwszy od Androida 12, w przypadku wszystkich aplikacji domyślny ekran powitalny systemu Android będzie wyświetlany przy uruchomieniu „na zimno” i przy uruchomieniu częściowo z pamięci. Domyślnie ten ekran powitalny jest tworzony z elementu ikony programu uruchamiającego aplikację oraz elementu windowBackground motywu (jeśli jest ustawiony w jednym kolorze).

Jeśli nie przeniesiesz swojej aplikacji, jej uruchamianie na Androidzie 12 i późniejszych wersjach może się pogorszyć lub spowodować niezamierzone skutki.

  • Jeśli istniejący ekran powitalny został wdrożony za pomocą motywu niestandardowego, który zastępuje android:windowBackground, system na Androidzie 12 lub nowszym zastępuje niestandardowy ekran powitalny domyślnym ekranem powitalnym systemu Android. Może to nie być zamierzone działanie aplikacji.

  • Jeśli obecny ekran powitalny został wdrożony przy użyciu dedykowanego elementu Activity, uruchomienie aplikacji na urządzeniach z Androidem 12 lub nowszym spowoduje zduplikowanie ekranów powitalnych: pojawią się ekran powitalny systemu, a po nim widoczna będzie aktywność na tym ekranie.

Aby im zapobiec, możesz uniknąć negatywnych lub niezamierzonych działań, przeprowadzając proces migracji opisany w tym dokumencie. Po migracji interfejs API skraca czas uruchamiania, daje pełną kontrolę nad ekranem powitalnym i zapewnia bardziej spójną obsługę innych aplikacji na platformie.

Biblioteka compat ze SplashScreen

Możesz użyć interfejsu API SplashScreen, ale zdecydowanie zalecamy użycie biblioteki Comppat z Androidem x SplashScreen. Biblioteka compat korzysta z interfejsu SplashScreen API, umożliwia wsteczną zgodność i zapewnia spójny wygląd ekranu powitalnego we wszystkich wersjach Androida. Ten dokument jest tworzony za pomocą biblioteki compat.

Jeśli przeprowadzasz migrację bezpośrednio za pomocą interfejsu SplashScreen API, w Androidzie 11 i starszych ekran powitalny wygląda dokładnie tak samo jak przed migracją. Począwszy od Androida 12 ekran powitalny wygląda i działa tak samo jak w Androidzie 12.

Jeśli przeprowadzasz migrację za pomocą biblioteki Comppat (SplashScreen), system wyświetla ten sam ekran powitalny we wszystkich wersjach Androida.

Migracja implementacji ekranu powitalnego

Aby przenieść dotychczasową implementację ekranu powitalnego na Androida 12 lub nowszego, wykonaj te czynności.

Ta procedura ma zastosowanie do każdego typu implementacji, z której przeprowadzasz migrację. Jeśli przeprowadzasz migrację z specjalnej Activity, postępuj zgodnie ze sprawdzonymi metodami opisanymi w tym dokumencie, aby dostosować niestandardowy ekran powitalny Activity. Interfejs SplashScreen API skraca też czas oczekiwania na uruchomienie, który jest wprowadzany przez specjalne działanie na ekranie powitalnym.

Aby przenieść ekran powitalny:

  1. W pliku build.gradle zmień compileSdkVersion i uwzględnij w zależności bibliotekę compat SplashScreen.

    build.gradle
    
    android {
       compileSdkVersion 31
       ...
    }
    dependencies {
       ...
       implementation 'androidx.core:core-splashscreen:1.0.0-beta02'
    }
    
  2. Utwórz motyw z elementem nadrzędnym Theme.SplashScreen. Ustaw wartość postSplashScreenTheme na motyw, którego musi używać Activity, a wartość windowSplashScreenAnimatedIcon na element rysowalny lub animowany. Pozostałe atrybuty są opcjonalne.

    <style name="Theme.App.Starting" parent="Theme.SplashScreen">
       <!-- Set the splash screen background, animated icon, and animation
       duration. -->
       <item name="windowSplashScreenBackground">@color/...</item>
    
       <!-- Use windowSplashScreenAnimatedIcon to add a drawable or an animated
            drawable. One of these is required. -->
       <item name="windowSplashScreenAnimatedIcon">@drawable/...</item>
       <!-- Required for animated icons. -->
       <item name="windowSplashScreenAnimationDuration">200</item>
    
       <!-- Set the theme of the Activity that directly follows your splash
       screen. This is required. -->
       <item name="postSplashScreenTheme">@style/Theme.App</item>
    </style>
    

    Jeśli chcesz dodać kolor tła pod ikoną, możesz użyć motywu Theme.SplashScreen.IconBackground i ustawić atrybut windowSplashScreenIconBackground.

  3. W pliku manifestu zastąp motyw początkowej aktywności motywem utworzonym w poprzednim kroku.

    <manifest>
       <application android:theme="@style/Theme.App.Starting">
        <!-- or -->
            <activity android:theme="@style/Theme.App.Starting">
    ...
    
  4. Zanim zadzwonisz pod numer installSplashScreen, w ramach czynności początkowej zadzwoń pod numer super.onCreate().

    Kotlin

    class MainActivity : Activity() {
    
       override fun onCreate(savedInstanceState: Bundle?) {
           // Handle the splash screen transition.
           val splashScreen = installSplashScreen()
    
           super.onCreate(savedInstanceState)
           setContentView(R.layout.main_activity)
    ...
    

    Java

    public class MainActivity extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
             // Handle the splash screen transition.
             SplashScreen splashScreen = SplashScreen.installSplashScreen(this);
    
             super.onCreate(savedInstanceState);
             setContentView(R.layout.main_activity);
        }
    }
    

installSplashScreen zwraca obiekt ekranu powitalnego, którego możesz opcjonalnie użyć do dostosowania animacji lub do utrzymania ekranu powitalnego przez dłuższy czas. Więcej informacji o dostosowywaniu animacji znajdziesz w sekcjach Wyświetlanie ekranu powitalnego przez dłuższy czas i Dostosowywanie animacji w celu zamknięcia ekranu powitalnego.

Dostosuj aktywność na ekranie powitalnym do ekranu powitalnego

Po przejściu na ekran powitalny w Androidzie 12 i nowszych zdecyduj, co zrobić z poprzednim niestandardowym ekranem powitalnym Activity. Do wyboru masz te opcje:

  • Zachowaj niestandardową aktywność, ale zablokuj jej wyświetlanie.
  • Zachowaj aktywność niestandardową ze względu na budowanie marki.
  • Usuń tę aktywność i w razie potrzeby dostosuj aplikację.

Zapobiegaj wyświetlaniu niestandardowej aktywności

Jeśli poprzedni ekran powitalny Activity służy przede wszystkim do wyznaczania tras, zastanów się, jak go usunąć. Możesz np. podać bezpośredni link do działania lub przejść do pojedynczej aktywności z podkomponentami. Jeśli nie jest to możliwe, możesz użyć SplashScreen.setKeepOnScreenCondition, aby zachować działanie routingu, ale zatrzymać jego renderowanie. Powoduje to przeniesienie ekranu powitalnego do następnego działania i zapewnia płynne przejście.

Kotlin

  class RoutingActivity : Activity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        val splashScreen = installSplashScreen()
        super.onCreate(savedInstanceState)

        // Keep the splash screen visible for this Activity.
        splashScreen.setKeepOnScreenCondition { true }
        startSomeNextActivity()
        finish()
     }
   ...
  

Java

  public class RoutingActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
      SplashScreen splashScreen = SplashScreen.installSplashScreen(this);

       super.onCreate(savedInstanceState);

       // Keep the splash screen visible for this Activity.
       splashScreen.setKeepOnScreenCondition(() -> true );
       startSomeNextActivity();
       finish();
    }
  ...
  

Zachowaj niestandardową aktywność związaną z budowaniem marki

Jeśli chcesz użyć poprzedniego ekranu powitalnego Activity w związku z budowaniem marki, możesz przejść z ekranu powitalnego systemu na niestandardowy ekran powitalny Activity, dostosowując animację do jego zamknięcia. Najlepiej jest jednak w miarę możliwości unikać takich sytuacji i oznaczać ekran powitalny za pomocą interfejsu SplashScreen API.

Jeśli musisz wyświetlić okno dialogowe, zalecamy, aby było się ono pojawiać przy kolejnej niestandardowej aktywności na ekranie powitalnym lub nad główną aktywnością po ekranie powitalnym systemu.

Usuwanie aktywności na niestandardowym ekranie powitalnym

Zalecamy, aby usunąć cały poprzedni niestandardowy ekran powitalny Activity, aby uniknąć duplikowania ekranów powitalnych, zwiększyć wydajność i skrócić czas wczytywania ekranu powitalnego. Są różne techniki, które pomogą Ci uniknąć wyświetlania zbędnych działań na ekranie powitalnym.

  • Użyj leniwego ładowania komponentów, modułów i bibliotek. Unikaj wczytywania i inicjowania komponentów lub bibliotek, które nie są wymagane do działania aplikacji w momencie jej uruchomienia. Wczytuj je później, gdy aplikacja będzie ich potrzebować.

    Jeśli aplikacja naprawdę potrzebuje komponentu, aby działał prawidłowo, ładuj go tylko wtedy, gdy jest faktycznie potrzebny, a nie w momencie uruchomienia. Możesz też użyć wątku w tle, aby wczytać go po uruchomieniu aplikacji. Postaraj się, by urządzenie Application.onCreate() było jak najlżejsze.

    Możesz też korzystać z biblioteki uruchamiania aplikacji, aby inicjować komponenty podczas uruchamiania aplikacji. Pamiętaj, aby nadal wczytywać wszystkie moduły wymagane na początek aktywności i nie wprowadzać zacięć, gdy moduły te są dostępne.

  • Utwórz obiekt zastępczy podczas lokalnego wczytywania niewielkiej ilości danych. Użyj zalecanej tematyki i wstrzymaj renderowanie, dopóki aplikacja nie będzie gotowa. Aby wdrożyć ekran powitalny zgodny wstecznie, wykonaj czynności opisane w sekcji Wyświetlanie ekranu powitalnego przez dłuższy czas.

  • Pokaż obiekty zastępcze. W przypadku ładowania sieciowego o nieokreślonym czasie trwania zamknij ekran powitalny i wyświetl obiekty zastępcze ładowania asynchronicznego. Rozważ zastosowanie do obszaru treści subtelnych animacji odzwierciedlających stan wczytywania. Zadbaj o to, aby struktura wczytanej treści była zgodna ze strukturą szkieletową i by umożliwić płynne przejście podczas wczytywania treści.

  • Korzystanie z pamięci podręcznej. Gdy użytkownik otworzy aplikację po raz pierwszy, możesz wyświetlić wskaźniki ładowania niektórych elementów interfejsu, tak jak na ilustracji poniżej. Następnym razem, gdy użytkownik wróci do aplikacji, możesz wyświetlić zawartość pamięci podręcznej w trakcie wczytywania nowszych treści.

Rysunek 1. Wyświetlam obiekty zastępcze interfejsu.