تصف دورة حياة التطبيق الحالات التي يمر بها التطبيق منذ لحظة تشغيله حتى إغلاقه، والانتقالات التي يتحكم فيها نظام التشغيل على طول الطريق. فقد يكون التطبيق نشطًا في الواجهة، حيث يتفاعل معه المستخدم، أو غير نشط لفترة وجيزة، مثلًا أثناء مكالمة واردة، أو في الخلفية، حيث لا يكون مرئيًا، أو معلّقًا، حيث يبقى في الذاكرة دون تنفيذ أي شيفرة. وعندما تنفد موارد الجهاز، يستطيع النظام إنهاء التطبيقات العاملة في الخلفية دون سابق إنذار.
وبالنسبة إلى المطورين، تُعدّ دورة الحياة حاسمة، لأن التطبيق يجب أن يستجيب على النحو الصحيح لكل انتقال. ففي Android، يحدث ذلك من خلال دوال دورة الحياة في الأنشطة مثل onCreate() و onResume() و onStop()، وفي iOS من خلال الأحداث في مفوَّضَي التطبيق والمشهد أو عبر scenePhase في SwiftUI. وبحفظ البيانات والحالة في اللحظات الصحيحة، وتحرير الموارد عندما لا يكون التطبيق مرئيًا، واستعادة الشاشة عندما يعود المستخدم، يستطيع المطورون ضمان أن يبدو التطبيق سريعًا وموثوقًا وألا يستهلك البطارية دون داعٍ.
تصف دورة حياة التطبيق الحالات التي يمر بها التطبيق منذ لحظة تشغيله حتى إغلاقه، مثل النشاط في الواجهة والعمل في الخلفية والتعليق. ويتحكم نظام التشغيل في الانتقالات ويستطيع إنهاء التطبيقات العاملة في الخلفية عندما تنفد الموارد. وبالاستجابة الصحيحة لكل انتقال، وحفظ البيانات والحالة في الوقت المناسب، وتحرير الموارد عندما لا يكون التطبيق مرئيًا، يستطيع المطورون إنشاء تطبيقات مستقرة وسريعة ورفيقة بالبطارية.
More about App Lifecycle
تُعدّ دورة حياة التطبيق جزءًا أساسيًا من تطوير التطبيقات، إذ تصف المراحل المختلفة التي يمر بها التطبيق من بدء التشغيل حتى الإنهاء. ويضمن التعامل الصحيح مع هذه العملية أن يعمل التطبيق على النحو الأمثل ويدير الموارد بكفاءة ويقدم تجربة مستخدم جيدة. ويُعدّ فهم دورة حياة التطبيق حاسمًا للمطورين الذين يريدون إنشاء تطبيقات متينة وموثوقة.
من الناحية التقنية، تتكون دورة حياة التطبيق من عدة مراحل يتحكم فيها نظام التشغيل. وتشمل هذه المراحل بدء التشغيل والعمل والنشاط في الخلفية والإنهاء. ولكل مرحلة متطلبات وفرص محددة لإدارة الموارد، ما يتيح للمطورين تحسين أداء التطبيق واستهلاكه للطاقة.
يمكن تقسيم دورة حياة التطبيق إلى ثلاث حالات رئيسية، تدعم كل منها أنواعًا مختلفة من التفاعل:
الحالة النشطة: في هذه الحالة، يكون التطبيق مرئيًا للمستخدم ويتفاعل معه مباشرة. وهنا ينفذ التطبيق معظم وظائفه، مثل تحديث واجهة المستخدم والاستجابة لمدخلات المستخدم. وتُعدّ الإدارة الفعالة للموارد في هذه الحالة حاسمة لضمان تجربة سلسة ومستجيبة.
حالة الخلفية: عندما لا يعود التطبيق في الواجهة لكنه لا يزال ينفذ مهام، يكون في حالة الخلفية. وقد يشمل ذلك مهام مثل مزامنة البيانات أو تشغيل الموسيقى. ومن المهم تقليل استهلاك الموارد في هذه الحالة إلى أدنى حد للحفاظ على عمر البطارية وأداء النظام.
الحالة المعلّقة: في هذه الحالة، لا يكون التطبيق نشطًا ولا يستهلك وقتًا من المعالج المركزي، وإن بقي في الذاكرة. ويعلّق نظام التشغيل التطبيقات العاملة في الخلفية لتوفير الطاقة، وإذا احتاج إلى الذاكرة لمهام أخرى، يستطيع إنهاء التطبيقات المعلّقة دون إشعار. لذا يجب تصميم التطبيق ليستأنف بسرعة، أو يستعيد حالته، عندما يعود إليه المستخدم.
ومن أكبر فوائد فهم دورة حياة التطبيق القدرة على تحسين أداء التطبيق وتجربة المستخدم. فبالتعامل الصحيح مع كل مرحلة، يستطيع المطورون تقليل خطر الأعطال، وتحسين استجابة التطبيق، وضمان عمله بكفاءة في ظروف مختلفة. وفضلًا عن ذلك، يستطيع المطورون تنفيذ ميزات أمنية تحمي بيانات المستخدم عندما ينتقل التطبيق إلى الخلفية، مثل إخفاء المحتوى الحساس من معاينة مبدّل التطبيقات.
كما تؤثر دورة حياة التطبيق في استهلاك الطاقة. فبضمان ألا يستخدم التطبيق الموارد إلا عند الضرورة، يستطيع المطورون إطالة عمر البطارية وتحسين تجربة المستخدم الإجمالية. وهذا مهم بشكل خاص للأجهزة المحمولة، حيث تكون سعة البطارية محدودة.
عمليًا، شكّل فهم دورة حياة التطبيق طريقة تطوير التطبيقات. فهو يتيح للمطورين إنشاء تطبيقات فعالة وسهلة الاستخدام معًا وقادرة على التكيف مع احتياجات المستخدم في الوقت الفعلي. وبإتقان دورة حياة التطبيق، يستطيع المطورون تقديم تجربة أكثر استقرارًا وإرضاءً للمستخدمين.
خلاصة القول، تُعدّ دورة حياة التطبيق جانبًا حاسمًا من تطوير التطبيقات يجمع بين الخبرة التقنية والتصميم المتمحور حول المستخدم. ويحسّن التعامل الجيد معها استهلاك الموارد وتجربة المستخدم، ما يجعلها معرفة أساسية لمطوري التطبيقات المعاصرين الذين يريدون إنشاء تطبيقات مبتكرة وموثوقة.
Frequently asked questions about App Lifecycle
ما الحالات التي يمر بها التطبيق أثناء تشغيله؟
عندما يعمل تطبيق على الهاتف، ينتقل بين حالات مختلفة، بحسب ما يفعله المستخدم. فقد يكون نشطًا في الواجهة، حيث يراه المستخدم ويستخدمه، أو في الخلفية، حيث لا يكون مرئيًا لكنه لا يزال محمّلًا.
وفي iOS، يُميَّز عادة بين حالات عدم التشغيل وعدم النشاط والنشاط والخلفية والتعليق. أما في Android، فيمر كل نشاط بحالات مثل الإنشاء والبدء والاستئناف والإيقاف المؤقت والإيقاف والتدمير. ويستطيع النظام إغلاق التطبيقات العاملة في الخلفية في أي وقت لتحرير الذاكرة. لذا يجب أن تستجيب شيفرة التطبيق على النحو الصحيح لكل انتقال.
كيف تؤثر دورة حياة التطبيق في تجربة المستخدم؟
عندما يتعامل التطبيق مع دورة حياته على النحو الصحيح، يستطيع المستخدم التبديل بين التطبيقات والعودة دون أن يفقد شيئًا. فالنموذج المملوء جزئيًا أو موضع التمرير أو الفيديو قيد التشغيل ينبغي أن يظل موجودًا عندما يفتح المستخدم التطبيق مرة أخرى.
وإذا جرى التعامل مع دورة الحياة على نحو خاطئ، فقد يبدأ التطبيق من جديد أو يفقد البيانات أو يواصل استخدام الكاميرا أو GPS أو البطارية في الخلفية. وهذا يسبب الإحباط وقد يؤدي إلى تقييمات سيئة. كما يجعل الاستئناف السريع من الخلفية التطبيق يبدو أسرع. لذا يُعدّ التعامل الجيد مع دورة الحياة جزءًا محوريًا من تجربة مستقرة وموثوقة.
كيف يتعامل المطورون مع الانتقالات بين الواجهة والخلفية؟
يُخطر نظام التشغيل التطبيق عندما تتغير حالته. ففي Android، يحدث ذلك من خلال دوال مثل onPause و onStop في النشاط، وبمكونات Lifecycle من Jetpack، تستطيع أجزاء أخرى من التطبيق الاستجابة للتغيرات نفسها. وفي iOS، تُستخدم دوال في مفوَّضَي التطبيق والمشهد، مثلًا عندما ينتقل المشهد إلى الخلفية، أو الخاصية scenePhase في SwiftUI.
وعندما ينتقل التطبيق إلى الخلفية، ينبغي أن يحفظ البيانات المهمة ويوقف الرسوم المتحركة ويحرر الموارد مثل الكاميرا وأجهزة الاستشعار. وعندما يعود، يمكن تحديث البيانات. أما العمل الذي يلزم أن يستمر في الخلفية فيجب جدولته بالأدوات المخصصة لذلك في النظام.
ماذا يحدث عندما يغلق النظام تطبيقًا في الخلفية؟
تستطيع أنظمة تشغيل الأجهزة المحمولة إغلاق التطبيقات العاملة في الخلفية دون سابق إنذار إذا احتاجت إلى الذاكرة لمهام أخرى. ومن الناحية المثالية، ينبغي ألا يلاحظ المستخدم ذلك: فعندما يُفتح التطبيق مرة أخرى، ينبغي أن يعرض الشاشة نفسها والبيانات نفسها كما كانت من قبل.
لذا يجب أن يحفظ التطبيق حالته باستمرار أو في اللحظة التي ينتقل فيها إلى الخلفية. ففي Android، يمكن حفظ كميات صغيرة من الحالة بـ onSaveInstanceState أو SavedStateHandle، بينما تُخزن البيانات الأهم في قاعدة بيانات. وفي iOS، توجد آليات مماثلة لاستعادة الحالة. ويستطيع المطورون اختبار ذلك بإجبار النظام على إغلاق التطبيق أثناء التطوير.
ما الفرق بين البدء البارد والبدء الدافئ؟
يحدث البدء البارد عندما يُشغَّل التطبيق من الصفر، مثلًا في المرة الأولى بعد التثبيت، أو بعد إعادة تشغيل الهاتف، أو بعد أن يغلق النظام التطبيق. فيتعين على النظام إنشاء عملية التطبيق وتحميل الشيفرة وبناء الشاشة الأولى، وهو ما يستغرق أطول وقت.
ويحدث البدء الدافئ عندما تظل عملية التطبيق موجودة في الذاكرة لكن يلزم إعادة إنشاء الشاشة، أما الاستئناف من الخلفية (البدء الساخن) فأسرع من ذلك. ولوقت بدء التشغيل تأثير كبير في الانطباع الأول لدى المستخدم. ويمكن تحسينه بتأجيل العمل غير الأساسي، وتحميل البيانات في الخلفية، وإبقاء إعداد بدء التشغيل خفيفًا قدر الإمكان.
كيف يمكن اختبار أن التطبيق يتعامل مع دورة حياته على النحو الصحيح؟
من الطرق البسيطة لاختبار دورة الحياة المرور يدويًا بالمواقف المعتادة: التبديل إلى تطبيق آخر والعودة، وتدوير الشاشة، وقفل الهاتف، وتلقي مكالمة، وإغلاق التطبيق بالكامل. وبعد كل خطوة، يُتحقق من الحفاظ على البيانات وحالة الشاشة.
وفي Android، يستطيع خيار المطور Don’t keep activities محاكاة إغلاق النظام للأنشطة، ويمكن استخدام ActivityScenario في الاختبارات المؤتمتة لنقل نشاط بين الحالات. وفي iOS، يستطيع Xcode محاكاة انتقال التطبيق إلى الخلفية أو إنهائه. ويمكن أن تُظهر أدوات تحليل الأداء ما إذا كان التطبيق يستهلك الموارد عندما لا يكون مرئيًا.
App Lifecycle for dummies
دورة حياة التطبيق طريقة لوصف سلوك التطبيق منذ لحظة فتحه حتى إغلاقه مرة أخرى. فكّروا فيها كقصة حياة التطبيق. فعندما يُفتح تطبيق على الهاتف، يكون «نشطًا»، ويمكن استخدامه. وإذا انتقل المستخدم إلى تطبيق آخر، ينتقل التطبيق الأول إلى «الخلفية»، حيث يظل مفتوحًا لكنه غير مستخدم. وبعد ذلك بقليل، عادة ما «يعلّقه» الهاتف، فيتوقف عن العمل ويوفر البطارية، وإذا احتاج الهاتف إلى الذاكرة، فقد يغلق التطبيق بالكامل. وعندما يُغلق التطبيق، تنتهي دورة حياته، ويحرر جميع الموارد التي كان يستخدمها. وتساعد دورة حياة التطبيق المطورين على تحسين طريقة استخدام التطبيقات لموارد الهاتف، حتى تعمل بسلاسة وكفاءة.