نقل بيانات تنفيذ شاشة البداية إلى نظام التشغيل Android 12 والإصدارات الأحدث

إذا كنت تستخدم شاشة بداية مخصّصة في Android 11 أو إصدار أقدم، عليك نقل تطبيقك إلى واجهة برمجة التطبيقات SplashScreen للمساعدة في ضمان عرضها بشكل صحيح في Android 12 والإصدارات الأحدث.

اعتبارًا من Android 12، يطبّق النظام شاشة البداية التلقائية لنظام Android على عمليات البدء على البارد وإعادة التشغيل البطيء لجميع التطبيقات. بشكل تلقائي، يتم إنشاء شاشة البداية هذه باستخدام عنصر رمز مشغّل التطبيق وwindowBackground الخاص بمظهرك، إذا كان لونًا واحدًا.

إذا لم تنقل تطبيقك، قد تنخفض جودة تجربة تشغيل التطبيق على الإصدار 12 من نظام التشغيل Android والإصدارات الأحدث أو قد تحدث نتائج غير مقصودة.

  • إذا تم تنفيذ شاشة البداية الحالية باستخدام مظهر مخصّص يتجاوز android:windowBackground، سيستبدل النظام شاشة البداية المخصّصة بشاشة بداية تلقائية لنظام Android على الإصدار 12 من نظام التشغيل Android والإصدارات الأحدث. قد لا تكون هذه هي التجربة التي يوفّرها تطبيقك.

  • إذا تم تنفيذ شاشة البداية الحالية باستخدام Activity مخصّص، سيؤدي تشغيل تطبيقك على الأجهزة التي تعمل بالإصدار 12 من نظام التشغيل Android أو الإصدارات الأحدث إلى ظهور شاشتَي بداية مكرّرتَين: شاشة البداية التابعة للنظام تظهر أولاً، يليها نشاط شاشة البداية الحالي.

يمكنك منع حدوث هذه التجارب المتدهورة أو غير المقصودة من خلال إكمال عملية النقل الموضّحة في هذا المستند. بعد نقل البيانات، سيؤدي استخدام واجهة برمجة التطبيقات إلى تحسين وقت بدء التشغيل، ومنحك تحكّمًا كاملاً في تجربة شاشة البداية، وإنشاء تجربة إطلاق أكثر اتساقًا مع التطبيقات الأخرى على المنصة.

مكتبة SplashScreen المتوافقة

يمكنك استخدام واجهة برمجة التطبيقات SplashScreen مباشرةً، ولكن ننصحك بشدة باستخدام مكتبة التوافق SplashScreen في Androidx بدلاً من ذلك. تستخدم مكتبة التوافق واجهة برمجة التطبيقات SplashScreen، وتتيح التوافق مع الإصدارات القديمة، وتوفّر مظهرًا موحّدًا لشاشة البداية على جميع إصدارات Android. تمت كتابة هذا المستند باستخدام مكتبة compat.

في حال نقل البيانات باستخدام واجهة برمجة التطبيقات SplashScreen مباشرةً، سيظهر تطبيقك على Android 11 والإصدارات الأقدم بالشكل نفسه الذي كان يظهر به قبل عملية النقل. بدءًا من نظام التشغيل Android 12، تتضمّن شاشة البداية المظهر والتصميم الخاصين بنظام التشغيل Android 12.

في حال نقل البيانات باستخدام مكتبة التوافق SplashScreen، يعرض النظام شاشة البداية نفسها على جميع إصدارات Android.

نقل عملية تنفيذ شاشة البداية

أكمِل الخطوات التالية لنقل عملية تنفيذ شاشة البداية الحالية إلى نظام التشغيل Android 12 والإصدارات الأحدث.

ينطبق هذا الإجراء على أي نوع من أنواع التنفيذ التي تريد نقل بياناتها. إذا كنت تنقل البيانات من Activity مخصّص، اتّبِع أفضل الممارسات الموضّحة في هذا المستند لتعديل Activity شاشة البداية المخصّصة. تعمل واجهة برمجة التطبيقات 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 على عنصر قابل للرسم أو عنصر قابل للرسم متحرك. أما السمات الأخرى، فهي اختيارية.

    <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 من خلال تخصيص الرسوم المتحركة لإغلاق شاشة البداية. ومع ذلك، من الأفضل تجنُّب هذا السيناريو قدر الإمكان واستخدام SplashScreen API لوضع العلامة التجارية على شاشة البداية.

إذا كنت بحاجة إلى عرض مربّع حوار، ننصحك بعرضه فوق نشاط شاشة البداية المخصّصة اللاحقة أو فوق النشاط الرئيسي بعد شاشة البداية الخاصة بالنظام.

إزالة نشاط شاشة البداية المخصّصة

بشكل عام، ننصحك بإزالة شاشة البداية المخصّصة السابقة Activity بالكامل لتجنُّب تكرار شاشات البداية، ولزيادة الكفاءة، ولتقليل أوقات تحميل شاشة البداية. هناك تقنيات مختلفة يمكنك استخدامها لتجنُّب عرض أنشطة شاشة البداية المكرّرة.

  • استخدِم التحميل الكسول للمكوّنات أو الوحدات أو المكتبات. تجنَّب تحميل أو تهيئة المكوّنات أو المكتبات غير المطلوبة لكي يعمل التطبيق عند التشغيل. ويمكنك تحميلها لاحقًا عندما يحتاج إليها التطبيق.

    إذا كان تطبيقك يحتاج إلى أحد المكوّنات ليعمل بشكل سليم، لا تحمّله إلا عند الحاجة إليه، وليس عند تشغيل التطبيق، أو استخدِم سلسلة محادثات في الخلفية لتحميله بعد بدء تشغيل التطبيق. حاوِل أن يكون Application.onCreate() خفيفًا قدر الإمكان.

    يمكنك أيضًا الاستفادة من استخدام مكتبة بدء تشغيل التطبيق لإعداد المكوّنات عند بدء تشغيل التطبيق. عند إجراء ذلك، احرص على تحميل جميع الوحدات المطلوبة للنشاط الذي سيتم بدءه، وتجنَّب حدوث أي مشاكل في الأداء عند توفّر الوحدات التي يتم تحميلها عند الطلب.

  • إنشاء عنصر نائب أثناء تحميل كمية صغيرة من البيانات محليًا استخدِم أسلوب تصميم المظاهر المقترَح، وتأخَّر في عرض المحتوى إلى أن يصبح التطبيق جاهزًا. لتنفيذ شاشة البداية المتوافقة مع الإصدارات القديمة، اتّبِع الخطوات الموضّحة في إبقاء شاشة البداية معروضة لفترات أطول.

  • إظهار العناصر النائبة بالنسبة إلى عمليات التحميل المستندة إلى الشبكة والتي تستغرق مدة غير محددة، يجب إغلاق شاشة البداية وعرض عناصر نائبة لعملية التحميل غير المتزامن. ننصحك بتطبيق رسوم متحركة بسيطة على مساحة المحتوى تعكس حالة التحميل. تأكَّد من أنّ بنية المحتوى الذي تم تحميله تتطابق مع بنية الهيكل قدر الإمكان لضمان انتقال سلس عند تحميل المحتوى.

  • استخدام التخزين المؤقت عندما يفتح المستخدم تطبيقك للمرة الأولى، يمكنك عرض مؤشرات التحميل لبعض عناصر واجهة المستخدم، كما هو موضّح في الشكل التالي. في المرة التالية التي يعود فيها المستخدم إلى تطبيقك، يمكنك عرض هذا المحتوى المخزّن مؤقتًا أثناء تحميل محتوى أحدث.

الشكل 1. عرض العناصر النائبة لواجهة المستخدم