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

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

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

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

في Android 10، توجد جميع الأنشطة التي يمكن التركيز عليها في الحزم المرئية في الحالة RESUMED . يؤدي ذلك إلى تحسين التوافق مع وضعي Multi-Window و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 مللي ثانية.

التوافق

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

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

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

الوصول المتزامن للكاميرا

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