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

ل الأنشطة إنه أكثر من مجرد عرض رسومي: فهو يمثل الوحدة الأساسية للتفاعل بين المستخدم والتطبيق. من الناحية الفنية، النشاط هو فئة Java/Kotlin تمتد إلى Activity o AppCompatActivity ويتم الإعلان عنها في الملف AndroidManifest.xml علىفي كل مرة يفتح فيها المستخدم شاشة أو ينفذ إجراءً مهمًا أو يتنقل بين الميزات، يوجد نشاط لإدارة الموارد والمنطق والواجهة.
يُنظّم نظام أندرويد الأنشطة باستخدام حزمة، مما يضمن للمستخدم إمكانية العودة إلى الشاشات السابقة باستخدام زر الرجوع. كما يُدير أندرويد دورة حياة النشاط تلقائيًا، مُحررًا الموارد عندما يصبح النشاط غير ذي صلة، لتحسين الذاكرة وعمر البطارية.

وهذا يعني أن لا توجد دالة main() كما هو الحال في اللغات الأخرى:يقرر Android أي نشاط يبدأ أولاً، ومتى يتم إيقافه، أو إعادة إنشائه، أو إنهائه، اعتمادًا على تفاعل المستخدم وحالة الجهاز.
لماذا من الضروري إتقان دورة حياة النشاط؟
إن فهم دورة حياة التطبيق وإدارتها يعد أمرًا أساسيًا لجودة أي تطبيق يعمل بنظام Android:
- يمنع تسرب الذاكرة:إذا لم تقم بتحرير الموارد في الوقت المناسب، فقد ينفد مخزون ذاكرة النظام ويتسبب في إيقاف التشغيل بشكل غير متوقع.
- يمنع فقدان معلومات المستخدم:إذا لم تقم بحفظ حالة الشاشة عند تغييرها، مثل تدويرها، فقد تختفي المعلومات، مما يسبب إحباطًا للمستخدم.
- يوفر تجربة سلسة حتى مع الانقطاعات:عند تلقي مكالمة أو تبديل التطبيقات أو تدوير الجهاز، يجب أن يتفاعل التطبيق بشكل أنيق وسريع.
- يسمح لك بتحسين الموارد (وحدة المعالجة المركزية، والبطارية، وأجهزة الاستشعار):نشط فقط عند الضرورة القصوى.
- تسهيل التنقل بين الشاشات (النوايا، الخلفية):يجب إدارة الإجراءات والنتائج وفقًا لدورة حياة كل نشاط.
الحالات الرئيسية وعمليات الاسترجاع لدورة حياة النشاط
تتم إدارة دورة حياة النشاط من خلال طرق استدعاء يستدعيها Android تلقائيًا. كل منها يُشير إلى نقطة محددة في عمر الشاشة:
- onCreate(حزمة حالة المثيل المحفوظة)تهيئة الواجهة وإنشاؤها. هنا، يتم توسيع المخطط وتكوين الموارد الأساسية.
- onStart ():يصبح النشاط مرئيًا ولكنه غير تفاعلي بعد.
- onResume ():يحتل النشاط مركز الصدارة وهو تفاعلي بالكامل.
- onPause ():يفقد النشاط التركيز ولكنه قد يظل مرئيًا جزئيًا (على سبيل المثال، الحوار المتداخل).
- onStop ():لم يعد النشاط مرئيًا، ويظل في الذاكرة ولكنه لا يستهلك الموارد النشطة.
- onRestart ():يتم استدعاؤها إذا تم إيقاف النشاط وتعود إلى المقدمة.
- onDestroy ():النشاط على وشك أن يتم تدميره ويجب تحرير جميع الموارد.
شرح مفصل لكل طريقة وأفضل الممارسات
onCreate (حزمة)
El أول طريقة يتم تنفيذها في حياة النشاط. يتم إجراء التهيئة الكاملة هنا:
- تم تضخيم واجهة المستخدم من خلال
setContentView(R.layout.tu_layout) - يتم استرداد البيانات من
Intentالذي بدأ النشاط - يتم تهيئة المتغيرات ونماذج العرض والمحولات والمستمعين
- تمت استعادة البيانات المحفوظة في
savedInstanceStateإذا كان ذلك ينطبق
يتم تشغيله مرة واحدة فقط لكل مثيل. يجب أن تتم جميع عمليات التهيئة المكثفة هنا، ولكن لا يجب أن يحجب الخيط الرئيسي.
onStart ()
يحدد اللحظة التي يصبح فيها النشاط مرئيًايمكن للمستخدم رؤيته، ولكن ليس بالضرورة التفاعل معه (لم يتم التركيز عليه بعد). مثالي لتحديثات واجهة المستخدم غير المهمة أو لتشغيل الموارد المرئية.
onResume ()
يستحوذ النشاط على التركيز؛ حيث يمكن للمستخدم النقر والتمرير والكتابة وما إلى ذلك. الآن هو الوقت المناسب لـ:
- إعادة تنشيط أجهزة الاستشعار
- استئناف الرسوم المتحركة أو العمليات المتوقفة مؤقتًا
- تحديث واجهة المستخدم بناءً على التغييرات الخارجية
يجب البدء هنا في أي شيء يتطلب أن يكون النشاط مرئيًا ونشطًا، ويجب إيقافه هنا. onPause ().
onPause ()
يستدعي Android هذه الميزة إذا كان النشاط على وشك فقدان التركيز: عندما يظهر مربع حوار، أو يتم بدء نشاط آخر فوقه، أو ينتقل المستخدم بعيدًا.
- إيقاف الرسوم المتحركة والموسيقى وأجهزة الاستشعار والمهام الخلفية مؤقتًا
- يخزن البيانات المؤقتة أو المستمرة، ولكن ليس البيانات الدائمة
- يحافظ على الطريقة خفيف جدا؛ هذا ليس الوقت المناسب لحفظ المعلومات الهامة أو إجراء عمليات ثقيلة
onStop ()
لم يعد النشاط مرئيًا. هنا، يجب عليك تحرير الموارد الثقيلة، وإيقاف التحديثات، وإغلاق اتصالات قاعدة البيانات، وإلغاء تسجيل المستمعين، وإجراء عمليات حفظ مستمرة.
إنه يعمل قبل ذلك بقليل onDestroy () إذا كان من المقرر تدمير النشاط، أو قبل ذلك onRestart () إذا عاد المستخدم.
onRestart ()
يتم استدعاؤه فقط عند إيقاف النشاط والعودة إلى الواجهة. يسمح لك بالتمييز بين الإنشاء الكامل وإعادة التشغيل من الذاكرة.
onDestroy ()
النداء الأخير: يُدمِّر أندرويد عملية النشاط. يُحرِّر هذا موارد، ويُكمِّل مهام، ويُوفِّر أساسيات. تنفيذه ليس مضمونًا دائمًا (إذا أوقف النظام العملية فجأةً، فلن يتم استدعاؤها).
الحالات البصرية والمفاهيمية للنشاط
يمكن تقسيم الدورة إلى حالات مفاهيمية:
- نشط (مستأنف): في المقدمة، تفاعلية، ومرئية. لا يمكن تفعيل سوى نشاط واحد لكل تطبيق.
- متوقف مؤقتًا: مرئي جزئيًا، بدون تركيز. لا يمكن للمستخدم التفاعل، لكن النشاط يبقى على الشاشة (على سبيل المثال، عند ظهور مربع حوار).
- متوقف: إنه غير مرئي، لكنه يبقى في الذاكرة للرد السريع إذا عاد المستخدم.
- مدمر: تم حذف المثيل. إذا عاد المستخدم، فسيتم إنشاؤه من الصفر ما لم يتم حفظ الحالة.
الانتقالات الشائعة: أمثلة عملية في الملاحة
- الإطلاق (تم فتح التطبيق لأول مرة):
onCreate()→onStart()→onResume() - بدء نشاط جديد:
onPause()→onStop()في النشاط السابق،onCreate()→onStart()→onResume()في الجديد - العودة إلى النشاط المتوقف:
onRestart()→onStart()→onResume() - اضغط على الصفحة الرئيسية أو قم بتبديل التطبيقات:
onPause()→onStop() - تدوير الشاشة:
onPause()→onStop()→onDestroy()→ [مثال جديد]onCreate()→onStart()→onResume()
تعتبر هذه التدفقات شائعة ويجب تنفيذها لتجنب المفاجآت في سلوك التطبيق.
إدارة تغيير التكوين: التدوير، واللغة، والموارد
يؤدي تغيير الإعدادات (تدوير الشاشة، تغيير اللغة، الوضع الداكن، لوحة المفاتيح الفعلية) إلى حدوث مشكلات في نظام Android تدمير وإعادة إنشاء النشاط التكيف مع البيئة الجديدة، مما يعني فقدان البيانات المخزنة في ذاكرة المثيل ما لم تُدار بشكل صحيح. آليات حفظ المعلومات هي:
- onSaveInstanceState(الحزمة):لحفظ أزواج المفاتيح والقيم مع حالة واجهة المستخدم (النصوص، المواضع، إلخ) قبل إتلافها مباشرةً. يتم استردادها في
onCreate()oonRestoreInstanceState(). - عرض النموذج: يسمح لك بتخزين البيانات المتعلقة بواجهة المستخدم والحالة التي يجب أن تتحمل تغييرات التكوين. هذا هو الحل الحديث والموصى به.
- تذكر قابل للحفظ (Jetpack Compose): يسمح للمتغيرات بمقاومة إعادة التكوين وإعادة تشغيل الواجهة.
على سبيل المثال، إذا أكمل المستخدم نموذجًا ثم قام بتشغيل الهاتف المحمول، حفظ حالة المثيل سيتم حفظ الحقول المدخلة واستعادتها بعد إعادة إنشاء الشاشة.
الاختلافات الرئيسية: onSaveInstanceState، وViewModel، وrememberSaveable
- onSaveInstanceState(الحزمة): للبيانات البسيطة (السلاسل والأرقام). غير مناسب للمجموعات الكبيرة أو الكائنات المعقدة، إذ يتطلب التسلسل وإلغاء التسلسل.
- الموديل: مثالي للبيانات المتوسطة أو المعقدة، حيث يظل موجودًا طالما كان النشاط أو الجزء موجودًا (بما في ذلك عمليات إعادة الإبداع بسبب تغييرات التكوين).
- تذكر قابل للحفظ: خاص بـ Jetpack Compose، فهو يخزن المتغيرات لمقاومة عمليات إعادة التكوين وإعادة إنشاء النشاط.
يعتمد الاختيار على نوع البيانات والهندسة والتكنولوجيا (واجهة المستخدم التقليدية مقابل Compose).
إدارة الأنشطة الخلفية وتوفير الموارد
يمكن لنظام Android إيقاف الأنشطة غير المرئية مؤقتًا أو إتلافها تحسين الذاكرة والبطاريةمن المرجح أن تختفي الأنشطة الخلفية إذا كان النظام يعاني من نقص في الموارد. لذلك، يجب عليك:
- إطلاق أجهزة الاستشعار والكاميرات والمواقع في
onPause()yonStop() - حفظ حالة واجهة المستخدم قبل مغادرة الشاشة
- تجنب المهام طويلة الأمد خارج النشاط المرئي
التنقل والتواصل بين الأنشطة: النوايا والنتائج
تتواصل الأنشطة وتتنقل مع بعضها البعض باستخدام النوايا، الأشياء التي تصف نية القيام بعمل ما:
- startActivity(النية): ابدأ نشاطًا دون انتظار نتيجة.
- startActivityForResult(النية، int): يبدأ نشاطًا ويتوقع أن يعيد نتيجة (مفيد لتحديد جهة اتصال، أو التقاط صورة، وما إلى ذلك).
تم استلام النتيجة في onActivityResult() مع رمز الحالة والبيانات المسترجعة.
النوايا الصريحة والضمنية: كيفية استخدامها والاختلافات بينهما
الكثير النوايا يمكن أن يكون:
- صريحة: تشير إلى فئة محددة. تُستخدم عادةً للتنقل داخل التطبيق.
- ضمني: إنها تصف إجراءً ما (على سبيل المثال، مشاركة رابط أو فتحه)، مما يسمح للتطبيقات الأخرى بالاستجابة فيما يتعلق بما إذا كانت قادرة على التعامل مع هذا الإجراء أم لا.
الأمثلة على ذلك:
- لفتح نشاطك الخاص:
Intent(this, ConfigActivity::class.java) - لمشاركة النص عبر البريد الإلكتروني:
Intent(Intent.ACTION_SEND)مع النوعtext/plain
الأنماط وأفضل الممارسات والأخطاء الشائعة في دورة الحياة
- لا تحظر مؤشر ترابط واجهة المستخدم en
onCreate():يجب تشغيل العمليات المكلفة (قواعد البيانات والشبكة) في الخلفية. - تجنب حفظ البيانات المستمرة في onPause():من الأفضل استخدامه
onStop()أو آليات مثل ViewModel أو قواعد البيانات. - لا تعتمد فقط على onDestroy():لا يتم استدعاء هذه الطريقة دائمًا إذا قام النظام بإنهاء العملية فجأة.
- استخدم LiveData و Observers للحفاظ على واجهة المستخدم متفاعلة مع التغييرات في البيانات المخزنة في ViewModel.
- يجب دائمًا استدعاء Super في عمليات الاسترجاع:اتصل بـ
super.onCreate()وغيرها لتجنب كسر سلوكيات النظام الافتراضية.
يؤدي تقسيم المهام بشكل صحيح استنادًا إلى الدورة إلى تقليل الأخطاء وتعظيم أداء التطبيق.
أمثلة على حالات الاستخدام الشائعة وتدفقات دورة الحياة
- افتح التطبيق للمرة الأولى: تسلسل
onCreate()→onStart()→onResume(). - النشاط مرئي جزئيًا: يظهر مربع حوار؛ يتم تنفيذه فقط
onPause()لكنها لا تزال مرئية. - الخروج والعودة إلى التطبيق: بعد الضغط على زر الصفحة الرئيسية والرجوع،
onRestart()→onStart()→onResume()(دون العودة إلىonCreate()). - دوران الجهاز: يتم تدمير النشاط وإعادة إنشائه، ثم تنفيذه مرة أخرى.
onCreate()trasonDestroy(). - الخروج نهائيًا (زر الرجوع):
onPause()→onStop()→onDestroy()

تعد هذه التدفقات أمرًا شائعًا، ويجب على المطورين توقع كل سيناريو واختباره لتجنب التسريبات أو فقدان البيانات أو السلوك غير المتسق.
التكامل المتقدم: دورة الحياة والعمليات وإدارة الذاكرة
يمكن لنظام أندرويد إيقاف عمليات كاملة لتوفير مساحة ذاكرة، خاصةً على الأجهزة منخفضة الموارد. تعتمد درجة الثغرة الأمنية التي يمكن تدميرها على الحالة:
| استادو | مرئي | في التركيز | احتمالية التدمير |
|---|---|---|---|
| مستأنف (نشط) | نعم | نعم | منخفض |
| بدأت/توقفت مؤقتًا | نعم | لا | الصور |
| توقف | لا | لا | ارتفاع |
| دمر | لا | لا | الإجمالي |
لهذا السبب، لا يقوم النظام بتدمير أي نشاط بشكل فردي: فهو يقتل العملية بأكملها، ومعها جميع حالات الأنشطة والأجزاء والخدمات في تلك العملية.
كيفية حفظ واستعادة حالة الواجهة بشكل صحيح
لضمان عدم فقدان المستخدم للمعلومات ذات الصلة بعد أحداث مثل التدوير أو إيقاف تشغيل الذاكرة أو التنقل، قم بدمج هذه الأساليب:
- استخدم onSaveInstanceState(الحزمة) للبيانات الخفيفة والمؤقتة (النص، التحديدات، التمرير)
- استعمال عرض النموذج للبيانات المعقدة والمستمرة (القوائم والكائنات ونتائج الشبكة)
- يستخدم قواعد البيانات أو التخزين المحلي للمعلومات طويلة الأمد أو معلومات المستخدم
لا تنسى أنه من أجل الاستعادة بشكل صحيح، onCreate() يجب عليك التحقق مما إذا كان Bundle هو فارغ، ويقرأ البيانات فقط إذا كانت تحتوي على قيم صالحة. onRestoreInstanceState() يتم استدعاؤه فقط عند حفظ شيء ما. يستدعي دائمًا الطرق super حتى لا تتم مقاطعة استعادة التسلسل الهرمي للعرض الافتراضي.
Jetpack Compose ودورة الحياة: التكامل الحديث
مع يؤلف Jetpackتتضمن دورة الحياة دورة حياة العناصر القابلة للتكوين، والتي يمكن لمتغيرات حالتها البقاء على قيد الحياة بعد عمليات إعادة التكوين (مع remember) وتغييرات التكوين (rememberSaveable). يستخدم:
- تذكر للمتغيرات التي تحتاجها فقط أثناء التكوين الحالي
- تذكر قابل للحفظ للاستمرار في إعادة إحياء النشاط
- عرض النموذج للبيانات العالمية أو المشتركة عبر شاشات متعددة أو عناصر قابلة للتكوين
الأخطاء الشائعة في دورة حياة النشاط ونصائح لتجنبها
- فقدان البيانات بعد الدوران: عدم الحفظ بشكل صحيح في
onSaveInstanceState()أو ViewModel. الحل: احفظ دائمًا ما هو ضروري. - تسريبات الذاكرة: لا تطلق سراح المستمعين أو تغلق الاتصالات في
onStop()yonDestroy(). - تعطلت واجهة المستخدم عند العودة إلى المقدمة: ترك العمليات الثقيلة نشطة بعد
onPause()oonStop(). استخدم الخيوط أو البرامج الفرعية لفصل المهام المكلفة. - تعطل بعد العودة إلى النشاط: فشل تهيئة الموارد أو فشل استعادة الحالة المتسقة وفقًا لتسلسل الدورة.
الموارد الموصى بها للتعمق في دورة حياة الأنشطة
- دليل Android الرسمي: دورة حياة النشاط
- ورشة عمل الكود العملي: مراحل دورة حياة النشاط
- دروس تعليمية على GitHub حول
ViewModelوإدارة الحالة المتقدمة في Compose
إتقان دورة حياة النشاط هو الخطوة الأولى نحو تطوير أندرويد احترافي. من الإعلانات في البيان إلى إدارة الحالة المتقدمة والتواصل عبر الشاشات، كل تفصيل مهم. باستخدام عمليات الاستدعاء العكسي، ونماذج العرض، وتكامل Compose بشكل صحيح، يمكنك ضمان تطبيقات مستقرة وسريعة وجاهزة للاستخدام، حتى على الأجهزة محدودة الموارد.
