مستقبل البث مكوّن محوري في منظومة Android يتيح للتطبيقات الاستماع إلى أحداث النظام أو الرسائل المخصصة المرسلة داخل الجهاز والاستجابة لها. وتتيح هذه الآلية للتطبيقات أن تُبلَّغ بالتغيرات في حالة النظام، مثل توصيل الجهاز بالشاحن أو تغير مستوى البطارية أو إنشاء اتصال شبكي أو فقدانه. وتُعدّ مستقبلات البث مهمة لإنشاء تطبيقات ديناميكية ومستجيبة تستطيع التكيف مع سياق المستخدم وبيئة الجهاز دون أن تكون نشطة باستمرار في الخلفية.
وتعمل مستقبلات البث بتسجيلها للاستماع إلى أحداث محددة، إما في ملف البيان أو في وقت التشغيل. وعندما يقع حدث يهتم به مستقبل البث، يُفعَّل وينفذ المنطق اللازم للتعامل مع الحدث. وهذا النهج موفر للموارد، إذ يتيح للتطبيقات الاستجابة للأحداث ذات الصلة دون استنزاف بطارية الجهاز أو الحاجة إلى مراقبة مستمرة، شريطة حماية المستقبلات على النحو الصحيح. لذا تُعدّ مستقبلات البث جزءًا محوريًا من تطوير Android، إذ تدعم نطاقًا واسعًا من الوظائف من الإشعارات إلى تحديثات البيانات.
مستقبل البث مكوّن في Android يتيح للتطبيقات الاستماع إلى أحداث النظام أو التطبيقات والاستجابة لها، حتى عندما لا يكون التطبيق في الواجهة. وكثيرًا ما تُستخدم هذه الوظيفة لعرض الإشعارات أو تحديث واجهات المستخدم أو تشغيل مزامنة البيانات في الخلفية، ما يضمن تجربة مستخدم أكثر ديناميكية واستجابة.
More about Broadcast Receiver
مستقبل البث مكوّن أساسي في تطوير Android يتيح للتطبيقات الاستجابة لرسائل بث النظام أو رسائل البث المخصصة التي ترسلها تطبيقات أخرى. وتتيح هذه الوظيفة للتطبيقات الاستماع إلى أحداث محددة والتصرف بناءً عليها، حتى عندما لا تكون نشطة في الواجهة، وهو أمر حاسم لإنشاء تطبيقات ديناميكية ومستجيبة.
من الناحية التقنية، يعمل مستقبل البث بالتسجيل لكائنات Intent محددة، وهي رسائل يرسلها النظام أو تطبيقات أخرى. وعندما يستقبل مستقبل البث Intent، يُفعَّل وينفذ الإجراء المحدد. وقد يكون ذلك أي شيء من تحديث واجهة المستخدم إلى جدولة العمل. ويمكن تسجيل مستقبلات البث ثابتًا في ملف البيان وديناميكيًا في الشيفرة، ما يمنح المطورين مرونة في كيفية الاستماع إلى رسائل البث وتوقيته. غير أنه منذ Android 8، لا يمكن استقبال معظم رسائل بث النظام الضمنية إلا بالمستقبلات المسجلة في الشيفرة.
تتعامل مستقبلات البث مع ثلاثة أنواع رئيسية من رسائل البث، يدعم كل منها أنواعًا مختلفة من التفاعل:
رسائل بث النظام: هي أحداث يرسلها نظام Android، مثل تغيرات حالة الشبكة أو مستوى البطارية، أو عندما ينتهي الجهاز من بدء التشغيل. ويستطيع التطبيق الاستماع إلى رسائل البث هذه لتكييف سلوكه مع حالة النظام. فعلى سبيل المثال، يستطيع التطبيق إيقاف المهام كثيفة البيانات مؤقتًا عندما يكون مستوى البطارية منخفضًا.
رسائل البث المخصصة: تستطيع التطبيقات إرسال رسائل بث خاصة بها للتواصل مع تطبيقات أخرى أو مع مكونات داخل التطبيق نفسه. وهذا يتيح للمطورين إنشاء تفاعلات بين أجزاء التطبيق المختلفة أو بين التطبيقات المختلفة، وإن كان الاتصال داخل التطبيق يُعالج عادة بشكل أفضل بآليات أخرى اليوم.
رسائل البث المرتبة: تُسلَّم رسائل البث هذه بالتتابع، حيث يستطيع كل مستقبل إيقاف رسالة البث أو تغيير محتواها قبل تمريرها إلى المستقبل التالي. وهذا مفيد في السيناريوهات التي يكون فيها ترتيب الاستقبال مهمًا أو التي ينبغي فيها أن يستطيع مستقبل ما إلغاء رسالة البث.
ومن أكبر نقاط قوة مستقبلات البث قدرتها على تفعيل التطبيقات بناءً على أحداث خارجية دون اشتراط عمل التطبيق باستمرار في الخلفية. وهذا يقلل استهلاك الموارد ويحسّن أداء الجهاز وعمر بطاريته. وفضلًا عن ذلك، يمكن الجمع بين مستقبلات البث ومكونات أخرى مثل الخدمات وموفّري المحتوى لإنشاء تطبيقات متينة وفعالة.
ويُعدّ انخفاض استهلاك مستقبلات البث للموارد ميزة مهمة أخرى. فبما أنها لا تُفعَّل إلا عند استقبال رسالة بث ذات صلة، فإنها تستهلك أدنى قدر من الطاقة وقدرة المعالجة، ما يجعلها مثالية للتطبيقات التي تحتاج إلى الوعي بأحداث النظام دون التأثير سلبًا في أداء الجهاز.
عمليًا، ظلت مستقبلات البث طويلًا جزءًا جوهريًا من تطوير Android. فهي تُستخدم للاستجابة لأحداث النظام مثل تغيرات الاتصال أو بدء تشغيل الجهاز أو تغير المنطقة الزمنية، أما رسائل البث المتعلقة بالمكالمات والرسائل النصية الواردة فمحمية بأذونات خاصة وتخضع لسياسات Google Play صارمة. كما تُستخدم المستقبلات لتشغيل مزامنة البيانات في الخلفية أو تحديث الأدوات المصغّرة أو عرض الإشعارات للمستخدم بناءً على أحداث خارجية، وبما أن onReceive() لا تملك إلا نحو عشر ثوانٍ للتنفيذ، يُسلَّم العمل الأطول إلى WorkManager.
خلاصة القول، تُعدّ مستقبلات البث تقنية تجمع بين البساطة والكفاءة والمرونة في حل يتيح لتطبيقات Android أن تكون أكثر استجابة ووعيًا بالسياق. وتجعلها قدرتها على العمل دون نشاط مستمر في الخلفية أداة مهمة في تطوير التطبيقات الحديث، حيث يكون تحسين الموارد وتجربة المستخدم محور الاهتمام.
Frequently asked questions about Broadcast Receiver
ما هو مستقبل البث في Android، وكيف يعمل؟
مستقبل البث في Android مكوّن يتيح للتطبيقات استقبال الرسائل، أو «رسائل البث»، من تطبيقات أخرى أو من النظام نفسه والاستجابة لها. ويمكن أن تكون رسائل البث مولّدة من النظام، مثل بدء تشغيل الجهاز أو تغير مستوى البطارية أو تبدّل الاتصال الشبكي. وعندما يُسجَّل مستقبل البث لنوع معين من رسائل البث، يُفعَّل تلقائيًا عند إرسال تلك الرسالة.
وتعمل مستقبلات البث بالاستماع إلى كائنات Intent محددة، وهي رسائل يرسلها النظام أو تطبيقات أخرى. وعندما يستقبل مستقبل البث Intent، ينفذ مهمة قصيرة، مثل تحديث واجهة المستخدم أو جدولة العمل. ومن المهم ملاحظة أن مستقبلات البث لا تستطيع تنفيذ مهام طويلة الأمد، إذ تعمل onReceive() على الخيط الرئيسي وقد تحجب واجهة المستخدم إذا استغرقت وقتًا طويلًا.
ومقارنة بمكونات أخرى مثل الخدمات، التي تستطيع العمل في الخلفية لفترات أطول، صُممت مستقبلات البث لتكون خفيفة ولا تنشط إلا لفترات قصيرة. وهذا يجعلها طريقة فعالة للاستجابة لأحداث النظام دون استهلاك موارد غير ضرورية. وهي مفيدة بشكل خاص للتعامل مع الأحداث التي تتطلب رد فعل فوريًا لا عملية دائمة.
كيف يُسجَّل مستقبل البث في تطبيق Android؟
يمكن تسجيل مستقبل البث بطريقتين. ففي التسجيل الثابت، يُعلن عنه في AndroidManifest.xml بعنصر receiver ومرشح Intent يحدد الرسائل التي ينبغي أن يستمع إليها. غير أنه منذ Android 8.0، لم يعد بالإمكان استقبال معظم رسائل بث النظام الضمنية بهذه الطريقة.
وفي التسجيل الديناميكي، يُنشأ المستقبل في الشيفرة ويُسجَّل بـ registerReceiver، عادة في نشاط أو خدمة. ولا يستقبل الرسائل إلا ما دام مسجلًا، ويجب إلغاء تسجيله بـ unregisterReceiver عندما لا تعود هناك حاجة إليه. وابتداءً من Android 14، يجب تحديد ما إذا كان يجوز للمستقبل استقبال رسائل من تطبيقات أخرى.
ما أنواع رسائل البث التي يستطيع مستقبل البث استقبالها؟
يستطيع مستقبل البث في Android استقبال أنواع مختلفة من رسائل البث، يمكن تجميعها في ثلاثة أنواع رئيسية:
- رسائل البث المولّدة من النظام: يرسل نظام Android رسائل البث هذه استجابة لأحداث النظام المختلفة. ومن الأمثلة تغيرات الاتصال الشبكي أو مستوى البطارية، أو انتهاء الجهاز من بدء التشغيل. وتُعدّ رسائل البث هذه أساسية للتطبيقات التي تحتاج إلى الاستجابة لتغيرات حالة النظام دون العمل باستمرار في الخلفية.
- رسائل البث الخاصة بالتطبيق: تستطيع التطبيقات إرسال رسائل بث خاصة بها للتواصل مع مكونات أخرى داخل التطبيق نفسه أو مع تطبيقات أخرى. ويمكن استخدام ذلك للإشارة إلى اكتمال إجراء معين، مثل تنزيل ملف أو تسجيل دخول مستخدم. وكثيرًا ما تُصمم رسائل البث هذه لتكون أكثر استهدافًا، ويمكن أن تكون عامة أو مقتصرة على التطبيق نفسه.
- رسائل البث الضمنية: لا تُوجَّه رسائل البث هذه إلى مستقبل محدد، بل تستند بدلًا من ذلك إلى إجراء عام. فعلى سبيل المثال، كان التطبيق يستطيع سابقًا التسجيل لاستقبال رسائل بث تشير إلى تثبيت تطبيق جديد، ومنذ Android 8، تتطلب رسائل البث الضمنية هذه في الغالب مستقبلًا مسجلًا في الشيفرة، ومنذ Android 11، تحد قواعد رؤية الحزم أيضًا من التطبيقات المرئية. وتوفر رسائل البث الضمنية المرونة، إذ تتيح للتطبيقات الاستجابة للأحداث دون معرفة المرسل المحدد.
ويجعل الجمع بين رسائل البث المولّدة من النظام والخاصة بالتطبيق والضمنية مستقبلات البث آلية قوية في Android تتيح اتصالًا واستجابات فعالة للأحداث على مستوى النظام والتطبيق معًا. وهذا يتيح للمطورين إنشاء تطبيقات ديناميكية ومستجيبة تستطيع التكيف مع التغيرات في بيئة المستخدم والنظام معًا.
كيف يُتعامل مع الأمان والأذونات في مستقبلات البث؟
تُعدّ مستقبلات البث في Android آلية قوية لاستقبال أحداث النظام والتطبيقات والاستجابة لها. ولضمان الأمان والتعامل الصحيح مع الأذونات عند العمل مع مستقبلات البث، ينبغي مراعاة عدة جوانب مهمة:
- النطاق المحدود: ينبغي عدم تصدير المستقبلات ما لم تكن التطبيقات الأخرى بحاجة فعلية إلى الإرسال إليها (android:exported=”false” في ملف البيان، أو RECEIVER_NOT_EXPORTED عند التسجيل في الشيفرة)، ما يقلل خطر الوصول غير المصرح به.
- استخدام الأذونات: بتحديد الأذونات المطلوبة في AndroidManifest.xml أو عند الإرسال، يمكن التحكم في التطبيقات التي يجوز لها إرسال رسائل بث معينة أو استقبالها. وتضمن الأذونات على مستوى التوقيع ألا تستطيع التفاعل مع المستقبلات إلا التطبيقات الموقعة بالمفتاح نفسه.
- رسائل البث الصريحة: تحد كائنات Intent الصريحة الموجهة إلى مستقبلات محددة، أو تعيين اسم حزمة على Intent، من الجهات التي تستطيع استقبال رسائل البث، ما يزيد الأمان بمنع الاستقبال غير المقصود أو الضار.
- أذونات وقت التشغيل: للعمليات الحساسة، يمكن اشتراط أن يمنح المستخدم إذنًا صريحًا في وقت التشغيل، ما يضيف طبقة أمان إضافية بضمان وعي المستخدم بالإجراء وموافقته عليه.
- البيانات المحدودة: ينبغي عدم إرسال البيانات الحساسة في رسائل بث تستطيع التطبيقات الأخرى استقبالها، وينبغي ألا تصل المستقبلات إلا إلى البيانات التي تحتاج إليها.
- التحقق من صحة الإدخال: ينبغي أن يتحقق المنطق في الشيفرة من صحة رسائل البث الواردة ويرشحها، بما يضمن ألا تُعالج إلا البيانات الصالحة والمتوقعة.
- بدائل LocalBroadcastManager: أُهمل LocalBroadcastManager، الذي كان يرسل رسائل البث داخل التطبيق فقط. ولأحداث التطبيق الداخلية، يُوصى بدلًا من ذلك بالأنواع القابلة للمراقبة مثل LiveData أو Kotlin Flow، أو بـ ViewModel مشترك، حتى لا تستطيع التطبيقات الخارجية اعتراض هذه الأحداث أو إرسالها.
إجمالًا، بالجمع بين النطاق المحدود وفحوص الأذونات ورسائل البث الصريحة وأذونات وقت التشغيل والبيانات المحدودة والتحقق من صحة الإدخال والبدائل الداخلية لرسائل البث، يمكن التعامل بفعالية مع الأمان والأذونات في مستقبلات البث في Android. وهذا يساعد على إبقاء التطبيقات آمنة ومنيعة أمام الوصول غير المصرح به والتلاعب.
ما الفرق بين التسجيل الثابت والتسجيل الديناميكي لمستقبلات البث؟
يمكن تسجيل مستقبلات البث في Android بطريقتين: ثابتة وديناميكية. ولهاتين الطريقتين استخدامات وانعكاسات أمنية مختلفة، من المهم فهمها لاختيار النهج الصحيح للتطبيق.
يتم التسجيل الثابت لمستقبلات البث من خلال ملف AndroidManifest.xml. فهنا يُعرَّف المستقبل كجزء من إعدادات التطبيق، ما يعني أنه يستطيع استقبال رسائل البث حتى عندما لا يكون التطبيق قيد التشغيل. وهذا مفيد لأحداث مثل انتهاء الجهاز من بدء التشغيل، لكن منذ Android 8.0 لم يعد بالإمكان استقبال معظم رسائل البث الضمنية، مثل تغيرات الشبكة، بهذه الطريقة. كما يمكن للتطبيقات الأخرى استهداف المستقبل الثابت المُصدَّر في أي وقت، ما قد تستغله التطبيقات الضارة إذا لم يكن محميًا.
أما التسجيل الديناميكي فيجري على النقيض من ذلك في شيفرة التطبيق، عادة في نشاط أو خدمة. وهذا يمنح تحكمًا أكبر في متى يكون المستقبل نشطًا، إذ لا يُسجَّل إلا ما دام المكوّن المعني قيد التشغيل. ويُعدّ التسجيل الديناميكي مثاليًا للاحتياجات المؤقتة، مثل الاستماع إلى أحداث محددة ما دام نشاط معين مفتوحًا. وتقلل هذه الطريقة خطر الوصول غير المرغوب فيه، إذ لا يكون المستقبل نشطًا إلا لفترة محدودة.
ويعتمد الاختيار بين التسجيل الثابت والديناميكي على حاجة التطبيق إلى الإتاحة والأمان. فالتسجيل الثابت يضمن استقبال رسائل معينة حتى عندما لا يكون التطبيق قيد التشغيل لكنه قد يزيد الخطر الأمني. أما التسجيل الديناميكي فيوفر تحكمًا وأمانًا أفضل لكنه يتطلب أن يكون التطبيق قيد التشغيل لاستقبال رسائل البث.
كيف يمكن تحسين الأداء عند استخدام مستقبلات البث في التطبيق؟
تُعدّ مستقبلات البث مكوّنًا أساسيًا في تطبيقات Android يتيح للتطبيقات الاستماع إلى أحداث النظام أو التطبيقات والاستجابة لها. ولتحسين الأداء عند استخدام مستقبلات البث في التطبيق، من المهم اتباع بعض أفضل الممارسات التي تضمن الكفاءة وتقلل استهلاك الموارد غير الضروري.
ومن أنجع طرق تحسين الأداء استخدام مستقبلات البث الديناميكية بدلًا من الثابتة حيثما أمكن. فمستقبلات البث الديناميكية تُسجَّل في الشيفرة، عادة في نشاط أو خدمة، ويمكن إلغاء تسجيلها عندما لا تعود هناك حاجة إليها. وهذا يمنع النظام من بدء عملية التطبيق لمجرد توصيل رسالة بث، ما يوفر الذاكرة ووقت المعالج المركزي والبطارية، إذ لا يكون المستقبل نشطًا إلا عند الحاجة.
وفضلًا عن ذلك، ينبغي عدم استخدام رسائل البث للاتصال داخل التطبيق فحسب. فقد كان LocalBroadcastManager يُستخدم سابقًا لهذا الغرض لكنه أُهمل، أما الأنواع القابلة للمراقبة مثل LiveData أو Kotlin Flow فتتجنب الحمل الإضافي لنظام البث كليًا وتحسّن استجابة التطبيق.
ومن التحسينات المهمة الأخرى تقليل الوقت المستغرق في الدالة onReceive() إلى أدنى حد. فبما أن مستقبلات البث تعمل على الخيط الرئيسي، قد تحجب العمليات الطويلة في onReceive() واجهة المستخدم وتسبب تجربة مستخدم سيئة. ولتجنب ذلك، ينبغي أن تنتهي onReceive() بسرعة وأن تفوّض المهام الأطول إلى WorkManager، أو للعمل غير المتزامن القصير إلى goAsync() مع خيط خلفي.
وأخيرًا، من المهم الانتباه إلى استهلاك البطارية. فينبغي عدم تسجيل المستقبلات للأحداث المتكررة الحدوث ما لم يكن ذلك ضروريًا تمامًا. ويمكن أيضًا استخدام JobScheduler أو WorkManager للتعامل مع المهام التي يمكن تنفيذها بشكل غير متزامن أو لاحقًا، عندما يكون الجهاز موصولًا بالكهرباء أو لديه اتصال شبكي جيد.
وباتباع هذه الإرشادات، يستطيع التطبيق استخدام مستقبلات البث بكفاءة، ما يحسّن الأداء وتجربة المستخدم معًا.
Broadcast Receiver for dummies
مستقبل البث ميزة ذكية على هاتف Android تتيح للتطبيقات «الاستماع» إلى إشارات أو رسائل معينة ترسلها تطبيقات أخرى أو النظام نفسه. تخيّلوا أن الهاتف حفلة كبيرة، وأن مستقبل البث كشخص ينصت لحظة يصيح أحدهم بشيء مهم، مثل «العشاء جاهز!» أو «الفيلم يبدأ!». وعندما يسمع ذلك، يستطيع نقل الخبر إلى التطبيقات المهتمة بتلك الرسالة. فعلى سبيل المثال، يستطيع تطبيق يتابع استخدام البطارية الاستماع إلى لحظة انخفاض طاقة الهاتف، حتى يعرض تحذيرًا. إنها طريقة تتيح للتطبيقات الاستجابة بسرعة وكفاءة للتغيرات دون الحاجة إلى التحقق طوال الوقت، ما يوفر الوقت والبطارية معًا.