تغييرات حالة النشاط

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

لمزيد من المعلومات حول حالات النشاط، يمكنك الاطّلاع على دورة حياة النشاط. لمعرفة كيف يمكن أن يساعدك الصف ViewModel في إدارة مراحل النشاط، يُرجى الاطّلاع على نظرة عامة على ViewModel.

حدوث تغيير في الإعدادات

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

وعند حدوث تغيير في الإعدادات، يتم تدمير النشاط وإعادة إنشائه. يؤدي ذلك إلى تشغيل عمليات الاستدعاء التالية في مثيل النشاط الأصلي:

  1. onPause()
  2. onStop()
  3. onDestroy()

يتم إنشاء مثيل جديد من النشاط، ويتم تشغيل عمليات الاستدعاء التالية:

  1. onCreate()
  2. onStart()
  3. onResume()

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

التعامل مع حافظات النوافذ المتعددة

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

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

لمزيد من المعلومات عن مراحل نشاط النوافذ المتعددة، يمكنك الاطّلاع على شرح دورة حياة النوافذ المتعددة في صفحة إتاحة النوافذ المتعددة.

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

عندما يبدِّل المستخدم من التطبيق "أ" إلى التطبيق "ب"، يطلب النظام الرمز onPause() على التطبيق "أ" و onResume() على التطبيق "ب". وهو يتنقل بين هاتين الطريقتين في كل مرة يبدّل فيها المستخدم بين التطبيقات.

لمزيد من التفاصيل حول وضع النوافذ المتعددة، يُرجى الاطّلاع على المقالة إتاحة النوافذ المتعددة.

ظهور النشاط أو مربّع الحوار في المقدّمة

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

وعند عودة النشاط المشمولة إلى المقدّمة وإعادة التركيز، يستدعي النظام onResume().

إذا ظهر نشاط أو مربّع حوار جديد في المقدّمة، مع التركيز على النشاط الجاري وتغطيته بالكامل، يفقد النشاط المغطى التركيز ويدخل في حالة "الإيقاف". بعد ذلك، يستدعي النظام، على التوالي، onPause() وonStop().

عند عودة الحالة نفسها من النشاط المغطى إلى المقدّمة، يستدعي النظام onRestart() وonStart() وonResume() بجانب النشاط. أما إذا كان هذا النشاط هو مثال جديد على النشاط المغطى الذي يأتي في الخلفية، فلن يستدعي النظام onRestart()، بل يستدعي onStart() وonResume() فقط.

ينقر المستخدم على زر الرجوع أو إيماءاته على الرجوع.

في حال كان هناك نشاط في المقدّمة ونقر المستخدم على زر الرجوع أو إيماءاته، ينتقل النشاط من خلال استدعاءات onPause() وonStop() وonDestroy(). يتم تدمير النشاط وإزالته من الحزمة الخلفية.

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

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

في حال إلغاء طريقة onBackPressed()، ننصحك بشدة بمواصلة استدعاء super.onBackPressed() من أسلوبك الذي تم تجاوزه. وإلا قد يكون سلوك "رجوع" في النظام مزعجًا للمستخدم.

يوقف النظام عملية التطبيق

إذا كان أحد التطبيقات في الخلفية ويحتاج النظام إلى إخلاء مساحة من الذاكرة لتطبيق يعمل في المقدّمة، يمكن للنظام إيقاف تطبيق الخلفية. عندما يوقف النظام تطبيقًا، ليس هناك ما يضمن استدعاء onDestroy() في التطبيق.

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

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