onBackPressed() قديم: كيفية معالجة زر "الرجوع" بشكل صحيح في Android

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

onBackPressed() قديم: كيفية معالجة زر "الرجوع" بشكل صحيح في Android



إذا كنت قد كتبت تطبيقات Android بلغة Kotlin من قبل، فمن المؤكد أنك واجهت طريقة onBackPressed(). حتى وقت قريب، كانت هذه هي الطريقة القياسية لاعتراض ضغط زر "الرجوع" النظامي. لكن في الإصدارات الأخيرة من Android Studio، ستلاحظ أن هذه الطريقة مشطوبة ومعلّمة بالتعليمة @Deprecated. يطرح سؤال منطقي: "onBackPressed() is deprecated. What is the alternative?" — هذا السؤال بالتحديد حصد آلاف المشاهدات على Stack Overflow.



في هذه المقالة، سنشرح لماذا قررت Google التخلي عن الطريقة القديمة، وسنعرض بأمثلة عملية من كود Kotlin كيفية معالجة ضغط زر "الرجوع" بشكل صحيح الآن. ستتعرف على OnBackPressedDispatcher و OnBackPressedCallback وكيفية دمج ذلك مع دورة حياة Activity و Fragment. هيا بنا!



لماذا أصبح onBackPressed() مهملاً (deprecated)؟



السبب الرئيسي هو التطور المعماري لنظام Android. الطريقة القديمة onBackPressed() كانت مرتبطة بشكل صارم بـ Activity. لم تكن تراعي الـ Fragments، ولم تدعم الأنماط الحديثة (MVVM, Clean Architecture) وكثيراً ما أدت إلى ارتباك عندما حاولت عدة مكونات معالجة نفس الحدث. اتبعت Google نهج التفويض: الآن يتم تمرير معالجة "الرجوع" إلى موزع خاص — OnBackPressedDispatcher.



هذا التغيير هو جزء من استراتيجية أوسع لتبسيط التنقل وتحسين دعم Jetpack. الآن يمكنك إضافة عدة استدعاءات عكسية (callbacks) تعمل بشكل منسق وتراعي دورة الحياة. إذا كنت تستخدم Navigation Component، فسيتم تفويض معالجة "الرجوع" تلقائياً إلى الرسم البياني للتنقل.



ما الذي حل محله: OnBackPressedDispatcher



بدءاً من Activity 1.0.0 (المضمنة في AndroidX)، قدمت Google واجهة برمجة تطبيقات جديدة. المكونات الرئيسية:



  • OnBackPressedDispatcher — الموزع المركزي الذي يدير جميع الـ callbacks.
  • OnBackPressedCallback — الفئة التي ترثها لتحديد منطق المعالجة الخاص بك.
  • LifecycleOwner — الربط بدورة الحياة (Activity أو Fragment).


بدلاً من إعادة تعريف طريقة Activity، تقوم بتسجيل callback في الموزع. الموزع يقرر بنفسه أي callback سيتم تنفيذه أولاً (وفقاً لمبدأ LIFO — آخر callback مضاف تتم معالجته أولاً).



التنفيذ الأساسي في Activity



لنبدأ بمثال بسيط. لنفترض أنك تريد إظهار مربع حوار تأكيد عند الضغط على "الرجوع"، لمنع المستخدم من إغلاق التطبيق عن طريق الخطأ.



الطريقة القديمة (مهملة):



// لم نعد نفعل ذلك!@Deprecatedoverride fun onBackPressed() {    showExitDialog()}


الطريقة الجديدة مع OnBackPressedDispatcher:



class MainActivity : AppCompatActivity() {    override fun onCreate(savedInstanceState: Bundle?) {        super.onCreate(savedInstanceState)        setContentView(R.layout.activity_main)

// تسجيل callback onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) { override fun handleOnBackPressed() { // المنطق المخصص الخاص بك showExitDialog() } }) }

private fun showExitDialog() { AlertDialog.Builder(this) .setTitle("خروج") .setMessage("هل أنت متأكد أنك تريد الخروج؟") .setPositiveButton("نعم") { _, _ -> finish() } .setNegativeButton("لا", null) .show() }}


لاحظ المعامل true في المُنشئ OnBackPressedCallback(true). هذا هو

المدونات

توصيات الكتب