استئناف متعدد

في الإصدار 9 من نظام Android (الإصدارات الأقدم)، تم إدخال حالة PAUSED إلى التطبيقات عند:

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

تختلف هذه الحالات في مقدار الإيقاف المؤقت الذي يجب أن ينفّذه التطبيق، ولكن لا يمكن على مستوى التطبيق.

في نظام Android 10، تتوفّر جميع الأنشطة التي يمكن التركيز عليها في الحزم المرئية في حالة RESUMED. ويعمل هذا على تحسين التوافق مع أوضاع النوافذ المتعددة وأوضاع MD للتطبيقات التي تستخدم onPause() بدلاً من onStop() لإيقاف إعادة تحميل واجهة المستخدم والتفاعل مع المستخدم. ويعني ذلك ما يلي:

  • ويتم استئناف كلا النشاطَين في وضع "تقسيم الشاشة".
  • يتم استئناف جميع الأنشطة الظاهرة في أعلى الشاشة في وضع النوافذ الحرة.
  • ويمكن استئناف الأنشطة على شاشات متعددة في الوقت نفسه.

الشكل 1. استئناف عدة مرات على جهاز قابل للطي

الشكل 2. استئناف متعدد في وضع سطح المكتب

يمكن أن تتوفّر الأنشطة في حالة "PAUSED" عندما يتعذّر التركيز عليها أو مغطاة جزئيًا، مثل:

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

وتشير هذه الطريقة للتطبيقات إلى أنّه يمكن لنشاط معيّن تلقّي مدخلات من المستخدم في حالة RESUMED فقط. قبل Android 10، ويمكن أن تتلقّى الأنشطة أيضًا إدخالات في حالة PAUSED (على سبيل المثال، جرِّب لمس كلا النشاطين في وضع تقسيم الشاشة في الوقت نفسه على جهاز يعمل بنظام التشغيل Android 9).

للاحتفاظ بإشارة استئناف من إصدارات Android السابقة (و إبلاغنا بالحالات التي يجب فيها حصول التطبيقات على إمكانية وصول حصري أو لمشتركين يتضمّن Android 10 معاودة اتصال جديدة:

Activity#onTopResumedActivityChanged(boolean onTop)

عند الاستدعاء، يتم استدعاء هذه الدالة بين Activity#onResume(). وActivity#onPause(). إنّ معاودة الاتصال هذه اختيارية ويمكن تخطّيها وبالتالي يمكن أن ينتقل النشاط من حالة RESUMED إلى حالة PAUSED بدون أن يحصلوا على أعلى ترتيب في النظام. على سبيل المثال، في وضع النوافذ المتعددة. بما أنّ معاودة الاتصال هذه اختيارية، فهي ليست جزءًا من النشاط دورة الحياة ويجب استخدامه نادرًا.

يتلقى النشاط السابق الأعلى استئنافًا وينتهي تنفيذ onTopResumedActivity(false) قبل النشاط التالي الذي يتم استئناف تشغيله يتلقى onTopResumedActivity(true) ما لم يتم إجراء النشاط السابق يستغرق الكثير من الوقت للتعامل مع استدعاء الطريقة ويصل إلى مهلة 500 ملي ثانية.

التوافق

للحفاظ على التوافق عند تنفيذ السيرة الذاتية المتعددة، ضع في اعتبارك ما يلي الرائدة.

العديد من الأنشطة المستأنفة في عملية تطبيق واحدة

  • المشكلة. في الإصدار 9 من نظام Android والإصدارات الأقدم، يتم تنفيذ نشاط واحد فقط في النظام. في كل مرة. تتضمن جميع الانتقالات بين الأنشطة إيقاف نشاط قبل استئناف نشاط آخر. وبعض التطبيقات وأُطر العمل (مثل Flutter LocalActivityManager في نظام Android) يستخدم هذه المعلومة، ويخزّن حالة النشاط النشاط في سينجلتون.
  • الحل. في الإصدار 9 من نظام Android والإصدارات الأقدم، إذا كان هناك نشاطان من العملية نفسها كلاهما، يستأنف النظام فقط النشاط الأعلى بترتيب Z. يمكن للتطبيقات التي تستهدف الإصدار 10 من نظام التشغيل Android إتاحة أنشطة متعددة يتم استئنافها في نفس الوقت.

الوصول إلى الكاميرا في آنٍ واحد

  • المشاكل: تظهر هذه المشاكل أيضًا في الإصدار 9 من نظام Android أَقَل على سبيل المثال، يمكن أن يؤدي استئناف النشاط ووضع ملء الشاشة إلى فقدان تركيز الكاميرا على النشاط الذي تم إيقافه مؤقتًا في الأعلى في وضع "نافذة ضمن النافذة" مع كونه أكثر وضوحًا باستخدام استخدام أوسع لأوضاع النوافذ المتعددة والعرض المتعددة.
    • بسبب التغييرات التي تم إجراؤها على حالة "RESUME"، قد لا يكون بإمكانك: انقطع الاتصال بالكاميرا حتى أثناء استئنافها. لحلّ هذه المشكلة، تحتاج التطبيقات التعامل مع فصل الكاميرا دون حدوث أعطال. عندما تكون التطبيقات غير متصلة، تحصل التطبيقات على مع اتصال غير متصل وجميع الاتصالات في واجهة برمجة التطبيقات تبدأ في طرح CameraAccessException
    • لا تضمن ملكية كاميرا resizeableActivity=false الحصول على كاميرا حصرية. لأنّه يمكن فتح التطبيقات الأخرى التي تستخدم الكاميرا على شاشات أخرى.
  • الحلول: يجب أن يقوم المطورون بتضمين منطق انقطع الاتصال بالكاميرا. في حال إلغاء ربط أحد التطبيقات بالكاميرا، يجب مشاهدة معاودة الاتصال بمدى توفّر الكاميرا لمحاولة إعادة الاتصال والمتابعة استخدام الكاميرا. بالإضافة إلى القائمة الحالية معاودة الاتصال "CameraManager#AvailabilityCallback#onCameraAvailable()"، تمت إضافة Android 10 CameraManager#AvailabilityCallback#onCameraAccessPrioritiesChanged(), الذي يغطي الحالة عندما يتم تبديل التركيز (وأولوية الكاميرا) بين عدة الأنشطة المستأنفة. على مطوري التطبيقات استخدام كلتا معاودة الاتصال هذه لتحديد الوقت المناسب لمحاولة الوصول إلى الكاميرا.

السير الذاتية المتعددة

في نظام Android 10، يتم تحديد حالة دورة حياة النشاط من خلال مستوى الرؤية ترتيب Z. للتأكد من أن الحالة الصحيحة بعد تحديث مستوى الرؤية على وتقييم حالة دورة الحياة السارية، واستدعاء طريقة ActivityRecord#makeActiveIfNeeded() من مختلف المواقع. في نظام Android 10، تشير كلمة "نشطة" إلى RESUMED أو PAUSED وتعمل فقط في هاتين الحالتين.

في Android 10، يتم تتبُّع استئناف النشاط بشكل منفصل في كل حزمة. بدلاً من أن تكون في موقع واحد في النظام. هذا لأن العديد من يمكن تنفيذ انتقالات الأنشطة في الوقت نفسه في أوضاع النوافذ المتعددة. بالنسبة التفاصيل، يُرجى الاطّلاع على ActivityStack#mInResumeTopActivity.

استدعاء النشاط الأعلى استئنافًا

بعد الإجراءات التي قد تؤدي إلى تغيير أهم نشاط (مثل النشاط إطلاق أو استئناف أو تغيير ترتيب Z)، تم استدعاء ActivityStackSupervisor#updateTopResumedActivityIfNeeded(). هذا النمط تتحقق مما إذا كان قد تم تغيير أعلى نشاط تم استئنافه وإجراء التحديث إذا احتاجت. إذا لم يسفر النشاط السابق الذي تم استئناف تشغيله من الأعلى فسيتم إرسال رسالة خسارة حالة أعلى تم استئنافها وتكون المهلة تمت جدولته على جهة الخادم (ActivityStackSupervisor#scheduleTopResumedStateLossTimeout()). يتم إرسال تقرير بالحالة الأكثر استئنافًا إلى النشاط التالي بعد إصدار واحد الحالة، أو عند انتهاء المهلة (راجع استخدامات:

ActivityStackSupervisor#scheduleTopResumedActivityStateIfNeeded()

تمت إضافة عنصر معاملة جديد على "TopResumedActivityChangeItem". لإبلاغ العملاء بتغييرات الحالة التي تم استئنافها والاستفادة من بنية ActivityLifecycler من نظام Android 9.

يتم تخزين الحالة ذات الاستئناف العلوي لدى العميل، وفي كل مرة يتم انتقالات النشاط إلى RESUMED أو PAUSED يتحقق مما إذا كان معاودة الاتصال onTopResumedActivityChanged() يجب تم استدعاء. يتيح ذلك انفصال بعض البيانات عن حالات مراحل النشاط وأعلى استئناف بين جانبَي الخادم والعميل.