تكرار السؤال: …
الإجابة المختصرة
المسجل استاتيكيًا يُعرّف في Manifest ويستيقظ التطبيق لاستقباله، بينما الديناميكي يُسجل برمجيًا في الكود ويعيش مع دورة حياة المكون المسجل له.
الشرح
قامت إصدارات أندرويد الحديثة (بدءًا من Android 8.0) بتقييد معظم الـ Implicit Broadcasts في الـ Manifest للحد من استنزاف البطارية وإيقاظ التطبيقات غير الضروري. لذلك تُسجل معظم الأحداث الحساسة (مثل تغير الاتصال بالشبكة) ديناميكيًا عبر registerReceiver في onStart وتُلغى في onStop لتفادي التسريب.
مثال بالكود
val receiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
// تنفيذ معالجة سريعة
}
}
override fun onStart() {
super.onStart()
registerReceiver(receiver, IntentFilter(Intent.ACTION_AIRPLANE_MODE_CHANGED))
}
override fun onStop() {
super.onStop()
unregisterReceiver(receiver)
}أخطاء شائعة
- نسيان استدعاء unregisterReceiver عند تدمير المكون مما يؤدي إلى تسريب الـ Context وكراش عند التكرار.
- تنفيذ عمليات معقدة أو استدعاءات شبكة طويلة داخل onReceive المحدودة بزمن استجابة قصير جدًا.