تطوير Android / الأساسي: أسس Android وCompose / الدرس 6
التنقل ومكدسات الرجوع ودورة الحياة
صمّم التنقل من القائمة إلى التفاصيل مع التمييز بين حضور الشاشة وإعادة إنشاء النشاط وعمر العملية.
في هذه الصفحة
أهداف الدرس
- نمذج الوجهات بمعاملات صغيرة وثابتة.
- اشرح انتقالات دورة الحياة واختر حدود استعادة الحالة.
عرّف عقود الوجهات
التنقل رحلة مستخدم ذات مكدس رجوع، وليس مجرد استبدال دوال تركيبية مرئية. تفتح وجهة القائمة تفاصيل يحددها معرّف سجل. يعود Back عبر التاريخ ويتبع Up هرم التطبيق، وقد يختلفان بعد دخول خارجي. اجعل معاملات الوجهة صغيرة وقابلة للتسلسل وحمّل السجل الفعلي من طبقة البيانات. تحتاج السجلات المفقودة والروابط غير الصحيحة والدخول دون مصادقة حالات شاشة مقصودة. ارسم هذه الحالات قبل التنفيذ كي لا يصبح المسار الناجح المسار المدعوم الوحيد.
افهم انتقالات النشاط
يستدعي Android الدوال onCreate وonStart وonResume وonPause وonStop وربما onDestroy عند تغير ظروف النشاط. الرؤية والتفاعل النشط مرتبطان لكنهما مختلفان، خصوصاً في بيئات النوافذ المتعددة. قد تدمر تغييرات الإعداد النشاط وتعيد إنشاءه مع استمرار عملية التطبيق. قد تزيل وفاة العملية جميع الكائنات في الذاكرة، ولا يُضمن استدعاء onDestroy قبل ذلك. لا تضع النسخة الوحيدة من بيانات المستخدم المهمة في دالة استدعاء ولا تعتمد على تنظيف أخير لحفظها. احفظ التعديلات المؤكدة عبر طبقة البيانات عندما يثبتها المستخدم.
اقرن المراقبة بالمالك المرئي
ينبغي لجمع البيانات في الواجهة مراعاة دورة الحياة كي لا تبقي شاشة غير مرئية عملاً غير لازم نشطاً. في Compose يعد collectAsStateWithLifecycle الجسر المعتاد لجمع Flow على Android، ويوفره lifecycle-runtime-compose. في نشاط يعتمد Views يمكن لـ repeatOnLifecycle بدء كتلة جمع وإلغائها حول حالة دورة حياة. يجب أن تكون إعادة تشغيل المراقب آمنة؛ يراقب الحقيقة الحالية بدلاً من تكرار شراء أو أمر غير قابل للعكس. تضبط إدارة دورة الحياة المراقبة ولا تحول coroutine عابرة إلى عمل خلفي دائم.
lifecycleScope.launch {
repeatOnLifecycle(Lifecycle.State.STARTED) {
viewModel.items.collect { items ->
adapter.submitList(items)
}
}
}
ضعه مرة واحدة بعد تهيئة adapter داخل ComponentActivity مع lifecycle-runtime-ktx واستيرادات coroutines. يفترض المثال ViewModel يكشف Flow ومحوّل قائمة. تستخدم شاشة Compose جسر الجمع الخاص بها بدلاً من إنشاء طبقة المحوّل هذه.
صنّف ما يجب استعادته
يصمد ViewModel عادة أمام إعادة إنشاء مالكه بسبب الإعداد، لكنه لا يصمد أمام وفاة العملية. احفظ معرّف تنقل صغيراً أو مسودة بآلية الحالة المدعومة وأعد تحميل السجلات الدائمة من التخزين. تجنب حفظ قوائم نتائج كاملة أو صور في Bundle. إعادة فتح التطبيق بعد الإيقاف الإجباري تختلف عن استعادة مهمة أعادها النظام، فحدّد التوقعات صراحة. اختبر الرجوع بعد الدخول المباشر وإعادة الإنشاء وتأكد من أن إعادة المحاولة لا تكرر إدخالات المكدس. يتحقق اختبار الاستعادة المفيد من مهمة المستخدم لا عنوان الشاشة فقط.
الأخطاء الشائعة وإصلاحها
ينكسر مسار التفاصيل لمعرّف يحتوي شرطة مائلة
- لماذا يحدث؟
- دُمجت البيانات الخام في صياغة المسار.
- كيف تصلحه؟
- رمّز المعامل أو استخدم تنقلاً ذا أنواع مضبوطاً بصورة صحيحة.
- كيف تتجنب تكراره؟
- اختبر الترقيم وUnicode والمعاملات المفقودة.
يؤدي الحفظ في onDestroy وحده إلى فقد التعديلات
- لماذا يحدث؟
- لا يضمن إنهاء العملية ذلك الاستدعاء.
- كيف تصلحه؟
- احفظ التغييرات المثبتة عند حدوثها واحفظ الحالة العابرة الصغيرة منفصلة.
- كيف تتجنب تكراره؟
- اختبر الاستعادة مع إعادة إنشاء العملية فعلياً.
تستمر شاشة مخفية في الجمع دون توقف
- لماذا يحدث؟
- يستخدم الجمع نطاقاً غير مدار.
- كيف تصلحه؟
- استخدم جمعاً يراعي دورة الحياة مع مالك الشاشة الصحيح.
- كيف تتجنب تكراره؟
- راجع عمر النطاق عند إضافة كل جامع.
اختبر فهمك
1. يفتح مستخدم رابط تفاصيل حُذف سجله. صف سلوك الوجهة وعقد الرجوع.
اعرض الحل المشروح
تحقق من المعرّف وابحث عبر المستودع واعرض حالة عدم وجود مع طريق إلى القائمة. لا تنشئ سجلاً فارغاً وهمياً. حدّد هل يغادر Back المهمة المدخولة خارجياً أم يعود عبر مكدس قائم، بينما يوفر Up هرم التطبيق بصورة متسقة.
2. تصمد مسودة أمام التدوير وتختفي بعد وفاة العملية. حدد السبب واختر تخزين نص المسودة والسجلات المؤكدة.
اعرض الحل المشروح
كانت المسودة على الأرجح في ViewModel وحده. يمكن للنص العابر الصغير استخدام الحالة المحفوظة إذا كفى عقد استعادتها؛ وتستحق المسودات المهمة طويلة العمر تخزيناً دائماً. تنتمي السجلات المؤكدة لقاعدة البيانات. احفظ الهوية اللازمة لإعادة تحميل السجل الحالي بدلاً من نسخ بياناته كاملة في الحالة المحفوظة.
أهم ما تعلمته
- تعبّر مكدسات الرجوع عن رحلة ذات مسارات دخول متعددة.
- تحتاج إعادة إنشاء الإعداد ووفاة العملية آليتي تعاف مختلفتين.
- يجب أن تكون المراقبة المراعية لدورة الحياة آمنة عند إعادة التشغيل.