Migracja implementacji ekranu powitalnego na Androida 12 lub nowszego

Jeśli masz niestandardowy ekran powitalny na Androidzie 11 lub starszym, przenieś aplikację na interfejs API SplashScreen, aby zapewnić jej prawidłowe wyświetlanie na Androidzie 12 i nowszych wersjach.

Począwszy od Androida 12, system stosuje domyślny ekran powitalny systemu Android przy uruchamianiu na zimno i częściowo z pamięci w przypadku wszystkich aplikacji. Domyślnie ten systemowy ekran powitalny jest tworzony przy użyciu elementu ikony programu uruchamiającego aplikacji i atrybutu windowBackground motywu, jeśli jest on jednokolorowy.

Jeśli nie przeniesiesz aplikacji, jej uruchamianie na Androidzie 12 i nowszych wersjach może być utrudnione lub może powodować niezamierzone skutki.

  • Jeśli Twój obecny ekran powitalny jest zaimplementowany za pomocą niestandardowego motywu, który zastępuje android:windowBackground, system zastąpi Twój niestandardowy ekran powitalny domyślnym ekranem powitalnym systemu Android na Androidzie 12 i nowszych wersjach. Może to nie być zamierzone działanie aplikacji.

  • Jeśli Twój obecny ekran powitalny jest zaimplementowany za pomocą dedykowanego elementu Activity, uruchomienie aplikacji na urządzeniach z Androidem 12 lub nowszym spowoduje wyświetlenie zduplikowanych ekranów powitalnych: najpierw pojawi się ekran powitalny systemu, a następnie Twój obecny ekran powitalny.

Możesz zapobiec tym problemom, wykonując proces migracji opisany w tym dokumencie. Po migracji interfejs API skraca czas uruchamiania, zapewnia pełną kontrolę nad ekranem powitalnym i sprawia, że uruchamianie aplikacji jest bardziej spójne z innymi aplikacjami na platformie.

biblioteka zgodności SplashScreen,

Możesz używać interfejsu API SplashScreen bezpośrednio, ale zdecydowanie zalecamy korzystanie z biblioteki zgodności Androidx SplashScreen. Biblioteka zgodności korzysta z interfejsu API SplashScreen, zapewnia zgodność wsteczną i tworzy spójny wygląd ekranu powitalnego we wszystkich wersjach Androida. Ten dokument został napisany przy użyciu biblioteki zgodności.

Jeśli przeprowadzisz migrację bezpośrednio za pomocą interfejsu API SplashScreen, na Androidzie 11 i starszych wersjach ekran powitalny będzie wyglądał dokładnie tak samo jak przed migracją. Od Androida 12 ekran powitalny ma wygląd i styl Androida 12.

Jeśli przeprowadzisz migrację za pomocą biblioteki zgodności SplashScreen, system będzie wyświetlać ten sam ekran powitalny we wszystkich wersjach Androida.

Przenoszenie implementacji ekranu powitalnego

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

Ta procedura dotyczy każdego typu implementacji, z którego przeprowadzasz migrację. Jeśli przeprowadzasz migrację z dedykowanego elementu Activity, postępuj zgodnie ze sprawdzonymi metodami opisanymi w tym dokumencie, aby dostosować niestandardowy ekran powitalny Activity. Interfejs API SplashScreen skraca też czas oczekiwania na uruchomienie, który jest wprowadzany przez aktywność związaną z dedykowanym ekranem powitalnym.

Aby przenieść ekran powitalny:

  1. W pliku build.gradle zmień compileSdkVersion i dodaj bibliotekę zgodności SplashScreen w zależnościach.

    build.gradle
    
    android {
       compileSdkVersion 31
       ...
    }
    dependencies {
       ...
       implementation 'androidx.core:core-splashscreen:1.0.0-beta02'
    }
    
  2. Utwórz motyw z rodzicem Theme.SplashScreen. Ustaw wartość postSplashScreenTheme na motyw, którego musi używać Activity, a wartość windowSplashScreenAnimatedIcon na obiekt rysowalny lub animowany obiekt rysowalny. 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 aktywności początkowej motywem utworzonym w poprzednim kroku.

    <manifest>
       <application android:theme="@style/Theme.App.Starting">
        <!-- or -->
            <activity android:theme="@style/Theme.App.Starting">
    ...
    
  4. Wywołaj installSplashScreen w aktywności początkowej przed wywołaniem 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 dłuższego wyświetlania ekranu powitalnego. Więcej informacji o dostosowywaniu animacji znajdziesz w sekcjach Keep the splash screen on-screen for longer periods (Dłuższe wyświetlanie ekranu powitalnego) i Customize the animation for dismissing the splash screen (Dostosowywanie animacji zamykania ekranu powitalnego).

Dostosuj aktywność niestandardowego ekranu powitalnego do ekranu powitalnego.

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

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

zapobiegać wyświetlaniu aktywności niestandardowej,

Jeśli poprzedni ekran powitalny Activity jest używany głównie do routingu, zastanów się, jak go usunąć. Możesz na przykład podać bezpośredni link do konkretnego działania lub przejść do pojedynczego działania z podkomponentami. Jeśli nie jest to możliwe, możesz użyć SplashScreen.setKeepOnScreenCondition, aby zachować aktywność routingu, ale zatrzymać jej renderowanie. Dzięki temu ekran powitalny zostanie przeniesiony do następnego działania, co zapewni 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();
    }
  ...
  

zachować aktywność niestandardową na potrzeby promowania marki,

Jeśli ze względów związanych z marką chcesz używać poprzedniego ekranu powitalnego Activity, możesz przejść z systemowego ekranu powitalnego do niestandardowego ekranu powitalnego Activity, dostosowując animację zamykania ekranu powitalnego. Najlepiej jednak unikać tego scenariusza i używać interfejsu SplashScreen API do oznaczania ekranu powitalnego marką.

Jeśli chcesz wyświetlić okno, zalecamy wyświetlenie go nad kolejnym niestandardowym ekranem powitalnym lub nad głównym działaniem po ekranie powitalnym systemu.

Usuwanie aktywności niestandardowego ekranu powitalnego

Zalecamy całkowite usunięcie poprzedniego niestandardowego ekranu powitalnegoActivity, aby uniknąć powielania ekranów powitalnych, zwiększyć wydajność i skrócić czas ładowania ekranu powitalnego. Istnieją różne techniki, które można zastosować, aby uniknąć wyświetlania zbędnych aktywności na ekranie powitalnym.

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

    Jeśli aplikacja naprawdę potrzebuje komponentu do prawidłowego działania, wczytuj go tylko wtedy, gdy jest naprawdę potrzebny, a nie podczas uruchamiania, lub użyj wątku w tle, aby wczytać go po uruchomieniu aplikacji. Postaraj się, aby Application.onCreate() był jak najlżejszy.

    Możesz też użyć biblioteki App Startup, aby zainicjować komponenty podczas uruchamiania aplikacji. Pamiętaj, aby nadal wczytywać wszystkie wymagane moduły dla aktywności początkowej i nie wprowadzać zacięć, gdy moduły ładowane leniwie staną się dostępne.

  • Utwórz obiekt zastępczy podczas wczytywania niewielkiej ilości danych lokalnie. Zastosuj zalecane podejście do motywów i wstrzymaj renderowanie, dopóki aplikacja nie będzie gotowa. Aby zaimplementować ekran powitalny zgodny wstecznie, wykonaj czynności opisane w sekcji Dłuższe wyświetlanie ekranu powitalnego.

  • Pokaż obiekty zastępcze. W przypadku wczytywania z sieci o nieokreślonym czasie trwania zamknij ekran powitalny i wyświetl obiekty zastępcze dla wczytywania asynchronicznego. Rozważ zastosowanie subtelnych animacji w obszarze treści, które odzwierciedlają stan wczytywania. Upewnij się, że struktura wczytanych treści jest jak najbardziej zgodna ze strukturą szkieletu, aby zapewnić płynne przejście po wczytaniu treści.

  • Używaj pamięci podręcznej. Gdy użytkownik po raz pierwszy otworzy aplikację, możesz wyświetlić wskaźniki ładowania niektórych elementów interfejsu, jak pokazano na ilustracji poniżej. Gdy użytkownik ponownie otworzy aplikację, możesz wyświetlić te treści z pamięci podręcznej, podczas gdy będą się wczytywać nowsze.

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