צריך להעביר את ההטמעה של מסך הפתיחה ל-Android 12 ואילך

אם הטמעתם מסך פתיחה בהתאמה אישית ב-Android 11 או בגרסאות קודמות, כדאי להעביר את האפליקציה ל-API‏ SplashScreen כדי לוודא שהיא תוצג בצורה תקינה ב-Android 12 ובגרסאות מאוחרות יותר.

החל מ-Android 12, המערכת מחילה את מסך הפתיחה שמוגדר כברירת מחדל במערכת Android על הפעלה קרה ועל הפעלה חמה של כל האפליקציות. כברירת מחדל, מסך הפתיחה של המערכת נוצר באמצעות רכיב סמל מרכז האפליקציות של האפליקציה וwindowBackground של ערכת הנושא, אם מדובר בצבע אחיד.

אם לא תעבירו את האפליקציה, יכול להיות שחוויית ההפעלה של האפליקציה ב-Android 12 ובגרסאות מתקדמות יותר תהיה פחות טובה או שתהיינה תוצאות לא רצויות.

  • אם מסך הפתיחה הקיים שלכם מיושם באמצעות עיצוב בהתאמה אישית שמבטל את ברירת המחדל של android:windowBackground, המערכת מחליפה את מסך הפתיחה בהתאמה אישית במסך פתיחה של מערכת Android שמוגדר כברירת מחדל ב-Android 12 ואילך. יכול להיות שזו לא חוויית השימוש המיועדת באפליקציה.

  • אם מסך הפתיחה הקיים שלכם מיושם באמצעות Activity, הפעלת האפליקציה במכשירים עם Android 12 ואילך תגרום להצגת מסכי פתיחה כפולים: מסך הפתיחה של המערכת יוצג, ואחריו פעילות מסך הפתיחה הקיימת.

כדי להימנע מבעיות כאלה, מומלץ להשלים את תהליך ההעברה שמתואר במסמך הזה. אחרי המעבר, ה-API משפר את זמן ההפעלה, נותן לכם שליטה מלאה בחוויית מסך הפתיחה ויוצר חוויית הפעלה עקבית יותר עם אפליקציות אחרות בפלטפורמה.

ספריית תאימות של SplashScreen

אפשר להשתמש ישירות ב-SplashScreen API, אבל מומלץ מאוד להשתמש במקום זאת בספריית התאימות של Androidx SplashScreen. ספריית התאימות משתמשת ב-API‏ SplashScreen, מאפשרת תאימות לאחור ויוצרת מראה ותחושה עקביים לתצוגת מסך הפתיחה בכל גרסאות Android. המסמך הזה נכתב באמצעות ספריית התאימות.

אם אתם מבצעים את ההעברה ישירות באמצעות SplashScreen API, ב-Android 11 ובגרסאות קודמות מסך הפתיחה ייראה בדיוק כמו לפני ההעברה. החל מ-Android 12, מסך הפתיחה נראה ומרגיש כמו Android 12.

אם מבצעים העברה באמצעות ספריית התאימות SplashScreen, המערכת מציגה את אותו מסך פתיחה בכל גרסאות Android.

העברת ההטמעה של מסך הפתיחה

כדי להעביר את ההטמעה הקיימת של מסך הפתיחה ל-Android 12 ואילך, מבצעים את השלבים הבאים.

ההליך הזה רלוונטי לכל סוג הטמעה שממנו מבצעים העברה. אם אתם מבצעים העברה מ-Activity ייעודי, כדאי לפעול לפי השיטות המומלצות שמתוארות במסמך הזה כדי להתאים את מסך הפתיחה המותאם אישית Activity. בנוסף, ה-API של SplashScreen מפחית את זמן האחזור של ההפעלה שנוצר עם פעילות מסך פתיחה ייעודית.

כדי להעביר את מסך הפתיחה:

  1. בקובץ build.gradle, משנים את compileSdkVersion וכוללים את ספריית התאימות SplashScreen בקשרי התלות.

    build.gradle
    
    android {
       compileSdkVersion 31
       ...
    }
    dependencies {
       ...
       implementation 'androidx.core:core-splashscreen:1.0.0-beta02'
    }
    
  2. יצירת עיצוב עם הורה מסוג Theme.SplashScreen. מגדירים את הערך של postSplashScreenTheme לעיצוב שבו Activity צריך להשתמש, ואת הערך של windowSplashScreenAnimatedIcon לרכיב drawable או לרכיב drawable מונפש. שאר המאפיינים הם אופציונליים.

    <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>
    

    אם רוצים להוסיף צבע רקע מתחת לסמל, אפשר להשתמש בעיצוב Theme.SplashScreen.IconBackground ולהגדיר את המאפיין windowSplashScreenIconBackground.

  3. בקובץ המניפסט, מחליפים את העיצוב של הפעילות הראשונית בעיצוב שיצרתם בשלב הקודם.

    <manifest>
       <application android:theme="@style/Theme.App.Starting">
        <!-- or -->
            <activity android:theme="@style/Theme.App.Starting">
    ...
    
  4. מתקשרים אל installSplashScreen בפעילות ההתחלתית לפני שמתקשרים אל 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 מחזיר את אובייקט מסך הפתיחה, שאפשר להשתמש בו כדי להתאים אישית את האנימציה או כדי להשאיר את מסך הפתיחה על המסך למשך זמן ארוך יותר. פרטים נוספים על התאמה אישית של האנימציה זמינים במאמרים בנושא הצגת מסך הפתיחה למשך זמן ארוך יותר והתאמה אישית של האנימציה לסגירת מסך הפתיחה.

התאמה של פעילות מסך הפתיחה בהתאמה אישית למסך הפתיחה

אחרי המעבר למסך הפתיחה ב-Android 12 ואילך, צריך להחליט מה לעשות עם מסך הפתיחה הקודם בהתאמה אישית Activity. עומדות לרשותכם האפשרויות הבאות:

  • לשמור את הפעילות המותאמת אישית, אבל למנוע את הצגתה.
  • להשאיר את הפעילות המותאמת אישית מסיבות שקשורות למיתוג.
  • מסירים את הפעילות המותאמת אישית ומשנים את האפליקציה לפי הצורך.

איך מונעים את הצגת הפעילות המותאמת אישית

אם מסך הפתיחה הקודם Activity משמש בעיקר לניתוב, כדאי לחפש דרכים להסיר אותו. לדוגמה, אפשר לקשר ישירות לפעילות בפועל או לעבור לפעילות יחידה עם רכיבי משנה. אם זה לא אפשרי, אפשר להשתמש ב-SplashScreen.setKeepOnScreenCondition כדי להשאיר את פעילות הניתוב במקום אבל למנוע את העיבוד שלה. כך מעבירים את מסך הפתיחה לפעילות הבאה ומאפשרים מעבר חלק.

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();
    }
  ...
  

שמירת הפעילות המותאמת אישית למיתוג

אם רוצים להשתמש במסך פתיחה קודם Activity מסיבות מיתוג, אפשר לעבור ממסך הפתיחה של המערכת למסך הפתיחה המותאם אישית Activity על ידי התאמה אישית של האנימציה לסגירת מסך הפתיחה. עם זאת, מומלץ להימנע מהתרחיש הזה ככל האפשר ולהשתמש ב-API כדי להוסיף מיתוג למסך הפתיחה.SplashScreen

אם אתם צריכים להציג תיבת דו-שיח, מומלץ להציג אותה על גבי פעילות מסך הפתיחה המותאם אישית הבאה או על גבי הפעילות הראשית אחרי מסך הפתיחה של המערכת.

הסרת פעילות מסך הפתיחה בהתאמה אישית

באופן כללי, מומלץ להסיר לחלוטין את מסך הפתיחה המותאם אישית הקודם Activity כדי למנוע כפילות של מסכי פתיחה, כדי לשפר את היעילות וכדי לקצר את זמני הטעינה של מסך הפתיחה. יש טכניקות שונות שאפשר להשתמש בהן כדי להימנע מהצגה של פעילויות מיותרות במסך הפתיחה.

  • משתמשים בטעינה עצלה לרכיבים, למודולים או לספריות. כדאי להימנע מטעינה או מאתחול של רכיבים או ספריות שלא נדרשים כדי שהאפליקציה תפעל בהפעלה. לטעון אותם מאוחר יותר, כשהאפליקציה תזדקק להם.

    אם האפליקציה באמת צריכה רכיב כדי לפעול בצורה תקינה, צריך לטעון אותו רק כשבאמת צריך אותו ולא בזמן ההפעלה, או להשתמש בשרשור ברקע כדי לטעון אותו אחרי שהאפליקציה מתחילה לפעול. כדאי לנסות לשמור על Application.onCreate() קליל ככל האפשר.

    אפשר גם להשתמש בספריית App Startup כדי לאתחל רכיבים בזמן הפעלת האפליקציה. כשעושים את זה, חשוב לוודא שכל המודולים הנדרשים לפעילות ההתחלתית נטענים, ושלא נוצרים שיבושים כשמודולים שנטענים באיחור הופכים לזמינים.

  • יוצרים placeholder בזמן טעינה של כמות קטנה של נתונים באופן מקומי. משתמשים בגישה המומלצת לעיצוב ערכות נושא ומשהים את העיבוד עד שהאפליקציה מוכנה. כדי להטמיע מסך פתיחה שתואם לאחור, פועלים לפי השלבים שמפורטים במאמר הצגת מסך הפתיחה למשך זמן ארוך יותר.

  • הצגת ערכי פלייסהולדר בטעינות מבוססות-רשת עם משכי זמן לא קבועים, צריך להסתיר את מסך הפתיחה ולהציג ערכי placeholder לטעינה אסינכרונית. כדאי להוסיף לאזור התוכן אנימציות עדינות שמשקפות את מצב הטעינה. חשוב לוודא שמבנה התוכן שנטען תואם ככל האפשר למבנה השלד, כדי שהמעבר יהיה חלק כשהתוכן ייטען.

  • שימוש במטמון. כשמשתמש פותח את האפליקציה בפעם הראשונה, אפשר להציג אינדיקטורים של טעינה עבור חלק מרכיבי ממשק המשתמש, כמו שמוצג באיור הבא. בפעם הבאה שהמשתמש יחזור לאפליקציה, תוכלו להציג את התוכן שנשמר במטמון בזמן שאתם טוענים תוכן עדכני יותר.

איור 1. מוצגים ערכי פלייסהולדר בממשק המשתמש.