تحدد دورة حياة التطبيق المحمول كيف يتصرف التطبيق عند التشغيل والتصغير والعودة من الخلفية والإغلاق. في هذه المقالة، سنشرح دورة حياة التطبيق (App Lifecycle) في iOS، ودورة حياة Activity في Android، ودورة حياة Fragment، ودورة حياة ViewController وLifecycleOwner. فهم هذه العمليات أمر بالغ الأهمية لمنع تسرب الذاكرة وفقدان البيانات والأداء غير الصحيح للتطبيق. للمزيد من التفاصيل، راجع الوثائق الرسمية لدورة حياة Activity في Android.
النقاط الرئيسية
قبل شرح دورة حياة الشاشات الفردية، من المهم فهم دورة حياة التطبيق بأكمله. في iOS، يمر التطبيق بـ خمس حالات: Not Running (غير قيد التشغيل)، Inactive (في الخلفية، لا يستقبل الأحداث)، Active (نشط)، Background (في الخلفية، يتم تنفيذ الكود) و Suspended (في الخلفية، الكود متوقف). تتم إدارة هذه الحالات في AppDelegate من خلال الطرق applicationDidFinishLaunching وapplicationDidBecomeActive وapplicationWillResignActive وapplicationDidEnterBackground وapplicationWillTerminate.
في Android، النظير هو دورة حياة التطبيق (Application Lifecycle) التي يتم تتبعها عبر واجهة Application.ActivityLifecycleCallbacks. ومع ذلك، يركز Android أكثر على دورة حياة Activity — شاشة تطبيق فردية.这是因为 يمكن أن يتكون تطبيق Android من Activities متعددة، كل منها بدورتها الخاصة.
النهج الحديث في Android هو استخدام ProcessLifecycleOwner من مكتبة lifecycle-process. يسمح بتتبع حالة العملية بأكملها دون الارتباط بـ Activity معينة. في iOS، يُستخدم UISceneDelegate (منذ iOS 13) أو AppDelegate لتتبع حالة التطبيق. يتعامل SceneDelegate مع النوافذ المتعددة (multiwindow) على iPad. فهم دورة حياة التطبيق مهم بشكل خاص لـ IT Sectr عند تطوير التطبيقات ذات المزامنة الخلفية والبث والمكالمات الصوتية عبر VoIP.
Activity هو المكون الأساسي لتطبيق Android، ويمثل شاشة واحدة. لـ Activity دورة حياة محددة بوضوح يديرها نظام التشغيل استجابةً لإجراءات المستخدم وأحداث النظام (تدوير الشاشة، مكالمة واردة، نقص الذاكرة).
| الطريقة | الوصف | ما يجب فعله |
|---|---|---|
| onCreate | تُستدعى مرة واحدة عند إنشاء Activity | تهيئة واجهة المستخدم، findViewById، إعداد ViewModel |
| onStart | تصبح Activity مرئية | بدء الرسوم المتحركة، تسجيل BroadCastReceiver |
| onResume | تحصل Activity على تركيز الإدخال | بدء الكاميرا وأجهزة الاستشعار والرسوم المتحركة |
| onPause | تفقد Activity التركيز (مرئية جزئياً) | حفظ المسودات، إيقاف الرسوم المتحركة |
| onStop | Activity غير مرئية | تحرير الموارد، إيقاف التحديثات |
| onDestroy | يتم تدمير Activity | تنظيف جميع المراجع، إلغاء الاشتراك من LiveData |
| onRestart | تُستدعى قبل onStart بعد onStop | إعادة التهيئة |
هام: onSaveInstanceState تُستدعى قبل onStop لحفظ الحالة المؤقتة. يتم الاستعادة في onCreate عبر Bundle savedInstanceState أو عبر SavedStateHandle في ViewModel. بدون معالجة صحيحة لدورة الحياة، سيفقد التطبيق جميع البيانات غير المحفوظة عند تدوير الشاشة.
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putString("draft", draftText)
}
override fun onDestroy() {
super.onDestroy()
// Отписка от всех подписок
}
}
في Jetpack Compose، تظل دورة حياة Activity دون تغيير، لكن Compose يوفر أدوات إضافية: التركيب المراعي لدورة الحياة عبر LifecycleOwner، وتأثيرات LifecycleEventEffect وDisposableEffect للتنظيف التلقائي للموارد عند التدمير.
Fragment في Android يعيش داخل Activity وله دورة حياة خاصة به، تتداخل جزئياً مع Activity ولكنها تضيف طرقاً جديدة. يمكن إضافة Fragments واستبدالها وإزالتها دون تدمير Activity، مما يجعلها أكثر مرونة ولكن أيضاً أكثر تعقيداً.
الطرق الرئيسية لدورة حياة Fragment: onAttach — تم إرفاق Fragment بـ Activity (أول استدعاء)؛ onCreate — تهيئة البيانات؛ onCreateView — إنشاء View؛ onViewCreated — تم إنشاء View، يمكن تكوين واجهة المستخدم؛ onStart — Fragment مرئي؛ onResume — Fragment في التركيز؛ onPause — Fragment يفقد التركيز؛ onStop — Fragment غير مرئي؛ onDestroyView — يتم تدمير View؛ onDestroy — يتم تدمير Fragment؛ onDetach — تم فصل Fragment عن Activity.
الفرق الرئيسي عن Activity: onCreateView و onDestroyView يمكن استدعاؤهما عدة مرات (على سبيل المثال، عند التبديل بين TabLayout)، بينما onCreate يُستدعى مرة واحدة. وبالتالي، يجب أن تتم تهيئة View في onViewCreated، وليس في onCreateView. يجب تنظيف الموارد المتعلقة بـ View (مثل محولات RecyclerView) في onDestroyView.
UIViewController هو الفئة الأساسية لإدارة الشاشات في iOS. تتكون دورة حياته من سلسلة من الطرق التي يستدعيها UIKit تلقائياً. فهم هذه الدورة أمر بالغ الأهمية للتهيئة الصحيحة لواجهة المستخدم وإدارة البيانات والذاكرة.
| الطريقة | متى تُستدعى | الاستخدام النموذجي |
|---|---|---|
| loadView | عندما يقوم View Controller بتحميل تسلسل View الخاص به | تهيئة مخصصة بدون storyboard |
| viewDidLoad | بعد تحميل View في الذاكرة (مرة واحدة) | إعداد واجهة المستخدم، تحميل البيانات الأولية |
| viewWillAppear | قبل ظهور View على الشاشة | تحديث البيانات، الاشتراك في الإشعارات |
| viewDidAppear | بعد ظهور View على الشاشة | بدء الرسوم المتحركة، بدء رسوم متابعة الحركة |
| viewWillDisappear | قبل اختفاء View من الشاشة | حفظ الحالة، إلغاء الاشتراك من الإشعارات |
| viewDidDisappear | بعد اختفاء View من الشاشة | إيقاف الرسوم المتحركة، تحرير الموارد |
| dealloc | عند تدمير View Controller | تحرير جميع الموارد |
هام: viewDidLoad تُستدعى مرة واحدة فقط في عمر View Controller. لتحديث البيانات في كل ظهور، استخدم viewWillAppear. إذا كنت تشترك في NotificationCenter في viewWillAppear، فتأكد من إلغاء الاشتراك في viewDidDisappear لتجنب تسرب الذاكرة.
يدير SwiftUI دورة حياة Views من خلال هياكل View. بدلاً من طرق الاستدعاء، يستخدم SwiftUI معدّلات onAppear و onDisappear. للحالات العامة للتطبيق، تُستخدم دورة حياة التطبيق عبر بروتوكولات App و Scene. يدير SwiftUI تلقائياً إنشاء وتدمير Views بناءً على الحالة، مما يبسط التطوير ولكنه يتطلب فهم هوية View وعمرها.
struct ContentView: View {
var body: some View {
Text("Hello")
.onAppear {
print("View появилась")
}
.onDisappear {
print("View исчезла")
}
}
}
LifecycleOwner هي واجهة من Android Architecture Components تشير إلى كائن له دورة حياة (Activity, Fragment). LifecycleObserver هي واجهة تسمح لكائن بالاشتراك في أحداث LifecycleOwner. معاً يشكلان أساس الإدارة التفاعلية لدورة الحياة في تطوير Android الحديث.
بدلاً من استدعاء الطرق صراحةً في onStart/onStop، يُوصى باستخدام DefaultLifecycleObserver (بديل لـ LifecycleObserver القديم مع تعليقات @OnLifecycleEvent). هذا هو النهج الذي تروج له Google لـ ViewModel والمكونات الأخرى التي تحتاج إلى التفاعل مع دورة الحياة دون وجود مراجع مباشرة لـ Activity أو Fragment.
class MyObserver : DefaultLifecycleObserver {
override fun onStart(owner: LifecycleOwner) {
// Подписка на обновления
}
override fun onStop(owner: LifecycleOwner) {
// Отписка
}
}
في IT Sectr، نستخدم LifecycleOwner في جميع مشاريع Android. تشترك ViewModel في LifecycleOwner الخاص بـ Activity عبر viewModelScope و lifecycleScope، مما يضمن الإلغاء التلقائي للكوروتينات عند تدمير Activity. هذا يمنع تسرب الذاكرة ويجعل الكود أنظف وأكثر أماناً.
الأسئلة الشائعة
تمر Activity بست حالات: Created (onCreate)، Started (onStart)، Resumed (onResume)، Paused (onPause)، Stopped (onStop)، Destroyed (onDestroy).
الترتيب: loadView → viewDidLoad → viewWillAppear → viewDidAppear → viewWillDisappear → viewDidDisappear. viewDidLoad تُستدعى مرة واحدة.
LifecycleOwner هو مكون من Android Architecture Components يملك دورة حياة Activity أو Fragment. يسمح بالاشتراك في الأحداث عبر LifecycleObserver.
يمر تطبيق iOS بخمس حالات: Not Running، Inactive، Active، Background، Suspended. تتم إدارة التحولات عبر UIApplicationDelegate.
Saved State هي آلية Android للحفاظ على حالة Activity/Fragment عند تدوير الشاشة أو إعادة إنشاء العملية. تستخدم onSaveInstanceState و SavedStateHandle.
الخلاصة
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.