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

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

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

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

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

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

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

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

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

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

تكييف نشاط شاشة البداية المخصّصة مع شاشة البداية

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

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

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

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

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

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

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

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

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

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

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