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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  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 או ל-animated 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 מחזיר את האובייקט של מסך הפתיחה, שבו אפשר להשתמש כדי להתאים אישית את האנימציה או כדי להשאיר את מסך הפתיחה על המסך למשך זמן ארוך יותר. לפרטים נוספים על התאמה אישית של האנימציה, קראו את המאמרים Keep the splash screen on-screen for longer periods ו-Customize the animation for dismissing the splash screen.

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

אחרי המעבר למסך הפתיחה ב-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 של מסך הפתיחה המותאם אישית

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

  • השתמשו בטעינה מדורגת (lazy loading) לרכיבים, למודולים או לספריות. אל תטענו או תאתחלו רכיבים או ספריות שלא נדרשים להפעלת האפליקציה. טוענים אותם מאוחר יותר, כשהאפליקציה צריכה אותם.

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

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

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

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

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

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