Notification Channel (قناة الإشعارات) هو آلية Android، تم تقديمها في الإصدار 8.0 (API 26)، وتقوم بتجميع الإشعارات حسب الفئات وتمنح المستخدم التحكم في سلوكها. تحدد كل قناة مستوى الأهمية، والصوت، والاهتزاز والمظهر المرئي لجميع الإشعارات المرسلة عبرها. وفقًا لـ Android Developers، NotificationChannel إلزامي لجميع الإشعارات على Android 8+ — وبدونه لا تظهر الإشعارات.
النقاط الرئيسية
Notification Channel هو حاوية منطقية للإشعارات من نفس النوع في Android 8+ (Oreo). يقوم المطور بإنشاء قناة بمعرف فريد (ID)، وتعيين معلماتها، ثم يرسل كل إشعار مع تحديد هذه القناة. ترث جميع الإشعارات في قناة واحدة إعداداتها.
قبل Android 8، كانت إدارة الإشعارات ثنائية: كل شيء أو لا شيء. لم يتمكن المستخدم سوى تعطيل جميع إشعارات التطبيق بالكامل. حلت القنوات هذه المشكلة: الآن يمكنك تعطيل إشعارات «التسويق» ولكن الاحتفاظ بـ «رسائل الأصدقاء».
بعد إنشاء القناة، يمكن للمستخدم تغيير أهميتها في أي وقت عبر الإعدادات → التطبيقات → الإشعارات. لا يمكن للمطور تغيير الأهمية برمجياً بعد إنشاء القناة — هذا قيد أماني في Android.
على Android 8+، يجب إرسال كل إشعار عبر NotificationChannel. إذا حاول التطبيق عرض إشعار بدون قناة، يتجاهله النظام بصمت. الاستثناء هو الإشعارات عبر NotificationCompat مع قناة افتراضي، والتي تنشئها المكتبة تلقائياً.
يتم تعريف قناة الإشعارات بمجموعة من المعلمات التي تُعين عند إنشائها عبر الفئة NotificationChannel. المعلم الرئيسي هو مستوى الأهمية، والذي يحدد كيف يتفاعل الإشعار مع المستخدم.
بعد الإنشاء، تظهر القناة في إعدادات الإشعارات بالنظام. يمكن للمستخدم تغيير الأهمية، أو تعطيل الصوت، أو الاهتزاز، أو حجب القناة بالكامل. تسري جميع التغييرات مفعولها فوراً لجميع الإشعارات اللاحقة.
عند إنشاء NotificationChannel، يمكنك تكوين: الصوت (مخصص أو تابع للنظام)، الاهتزاز (النمط والمدة)، مؤشر ضوئي (لون LED)، شارة التطبيق (setShowBadge)، شاشة القفل (setLockscreenVisibility) و وضع عدم الإزعاج (setBypassDnd). تثبت هذه المعلمات عند إنشاء القناة ويمكن للمستخدم فقط تغييرها لاحقاً.
مستوى الأهمية هو المعلم الرئيسي للقناة. يحدد ما إذا كان الإشعار سيشغل صوتاً، أو سيظهر على الشاشة، أو سيوضع ببساطة في الظل. لا يجب الخلط بين الأهمية والأولوية — الأهمية تحدد بواسطة القناة، والأولوية (setPriority) تتم تجاهلها على Android 8+.
| المستوى | الثابت | السلوك | الصوت |
|---|---|---|---|
| HIGH | IMPORTANCE_HIGH (4) | يعرض لافتة heads-up، يظهر في الظل | نعم |
| DEFAULT | IMPORTANCE_DEFAULT (3) | يظهر في الظل، بدون heads-up | نعم |
| LOW | IMPORTANCE_LOW (2) | يظهر في الظل بدون صوت | لا |
| MIN | IMPORTANCE_MIN (1) | فقط في الظل، بدون صوت أو اهتزاز | لا |
| NONE | IMPORTANCE_NONE (0) | لا يظهر بالمرة | لا |
لمعظم سيناريوهات المستخدم، استخدم IMPORTANCE_DEFAULT (3) — سيظهر الإشعار في الظل بصوت ولكن بدون لافتة منبثقة. استخدم IMPORTANCE_HIGH فقط للأحداث الحرجة: مكالمة واردة، رسالة من جهة اتصال، تذكير بالمؤقت.
تنشأ القناة مرة واحدة عند بدء التطبيق أو عند الاستخدام الأول. أفضل ممارسة هي إنشاء جميع القنوات عند بدء التطبيق، في دالة Application.onCreate. إعادة إنشاء قناة موجود آمنة — Android يتجاهل الاستدعاء إذا كانت القناة موجودة بالفعل.
class App : Application() {
override fun onCreate() {
super.onCreate()
createNotificationChannels()
}
private fun createNotificationChannels() {
val messagesChannel = NotificationChannel(
CHANNEL_MESSAGES,
"رسائل",
NotificationManager.IMPORTANCE_HIGH
).apply {
description = "إشعارات الرسائل الجديدة"
enableVibration = true
setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION))
}
val promoChannel = NotificationChannel(
CHANNEL_PROMO,
"العروض والأخبار",
NotificationManager.IMPORTANCE_LOW
).apply {
description = "إشعارات التسويق والعروض الخاصة"
setShowBadge(false)
}
val manager = getSystemService(NotificationManager::class.java)
manager.createNotificationChannel(messagesChannel)
manager.createNotificationChannel(promoChannel)
}
companion object {
const val CHANNEL_MESSAGES = "messages"
const val CHANNEL_PROMO = "promo"
}
}
عند إرسال إشعار، حدد معرف القناة عبر setChannelId (لـ NotificationCompat) أو في منشئ Notification.Builder. إذا لم تكن القناة ذات المعرف المحدد موجودة، فلن يتم عرض الإشعار، ولكن لن يحدث خطأ.
يوفر Android عدة API للإدارة البرمجية للقنوات: الحصول على قائمة، الحذف والتحقق من الإعدادات الحالية. يؤدي حذف القناة إلى إزالة جميع إشعاراتها من محفوظة النظام.
val manager =
getSystemService(NotificationManager::class.java)
// الحصول على قائمة جميع القنوات
val channels = manager.getNotificationChannels()
channels.forEach { channel ->
Log.d("Channels", "${channel.id}: ${channel.importance}")
}
// معرفة الأهمية الحالية (قد يكون المستخدم قد غيرها)
val channel = manager.getNotificationChannel(CHANNEL_MESSAGES)
if (channel.importance == NotificationManager.IMPORTANCE_NONE) {
// قام المستخدم بتعطيل القناة
suggestEnablingChannel()
}
// حذف القناة
manager.deleteNotificationChannel(CHANNEL_PROMO)
بعد إنشاء القناة، لا يستطيع المطور تغيير أهميتها برمجياً — هذا قيد في Android لحماية المستخدم من إساءة الاستخدام. إذا كنت تحتاج إلى تغيير أهمية قناة، قم بإنشاء قناة جديد بمعرف مختلف وهاجر الإشعارات.
إذا كنت تحتاج إلى تغيير أهمية قناة موجودة، قم بإنشاء قناة جديدة بمعرف مختلف (على سبيل المثال، «messages_v2») وابدأ في إرسال الإشعارات إليه. يمكن حذف القناة القديمة عبر deleteNotificationChannel — ستتم إزالة جميع إشعاراتها من المحفوظة. حذر المستخدم بشأن الترحيل عبر واجهة التطبيق لكي لا يفقد إعداداته.
تجمع NotificationChannelGroup عدة قنوات في مجموعة مرئية واحدة في واجهة إعدادات Android. تساعد المجموعات المستخدم على التنقل عندما يستخدم التطبيق 5+ قنوات: على سبيل المثال، «اجتماعي»، «نظام»، «تسويق».
تنشأ المجموعة عبر createNotificationChannelGroup وتُمرر إلى القناة عند إنشائها عبر طريقة setGroup. يؤدي حذف المجموعة أيضًا إلى حذف جميع قنواتها. يمكن لكل قناة الانتماء إلى مجموعة واحدة فقط.
في الممارسة، مجموعات القنوات موصى بها للتطبيقات التي تحتوي على أكثر من 3 قنوات. تبسط التنقل في الإعدادات وتقلل احتمال أن يقوم المستخدم بتعطيل جميع الإشعارات مرة واحدة دون فهم قائمة القنوات.
تنشأ المجموعة عبر createNotificationChannelGroup بمعرف واسم فريدين. ثم يتم ربط كل قناة بالمجموعة عبر طريقة setGroup. في إعدادات النظام، تظهر المجموعة كقسم بعنوان، تحته تُدرج جميع قنوات هذه المجموعة. إذا تم حذف مجموعة، فإن جميع قنواتها تتم إزالتها أيضًا تلقائياً بواسطة النظام دون إمكانية الاستعادة.
يؤثر تصميم قنوات الإشعارات بشكل مباشر على تجربة المستخدم والاحتفاظ به. النمط الرئيسي هو ثلاثة مستويات أهمية: قناة حرجة (IMPORTANCE_HIGH) للرسائل والمكالمات، قناة قياسية (IMPORTANCE_DEFAULT) للإشعارات العامة، وقناة هادئة (IMPORTANCE_LOW) للتسويق والأخبار. يمنح هذا التدريج المستخدم خياراً واضحاً دون إرهاق.
النمط الثاني هو قناة واحدة لكل وحدة وظيفية. كل وحدة رئيسية في التطبيق (دردشة، طلبات، تغذية أخبارية، تسويق) تحصل على قناتها الخاص. إذا كان هناك أكثر من 5 وحدات، قم بدمجها في NotificationChannelGroup. في إعدادات النظام، تظهر المجموعة كقسم بعناصر قابلة للطي — هذا يبسط التنقل.
النمط الثالث هو قناة المطور. أنشئ قناة منفصلة بـ IMPORTANCE_MIN لإشعارات التصحيح والخدمة. لن يراها المستخدمون في الظل، ولكن يمكن للمطور تحليل السجلات عبر adb. في الإنتاج، يمكن حذف هذه القناة أو إخفاؤها من الواجهة عبر Intent في الإعدادات.
النمط الرابع هو تغذية راجعة للقناة. أظهر للمستخدم في الواجهة القنوات النشطة وما هو مستوى أهميتها الحالي. على Android 8+، يمكنك الحصول على حالة القناة عبر getNotificationChannel وعرض تغيير الإعدادات للمستخدم إذا كانت القناة معطلة. هذا مهم بشكل خاص للوظائف الحرجة للتطبيق.
الأسئلة الشائعة
لن تظهر الإشعارات لن تظهر لا في الظل ولا في الدرج. يتجاهل النظام بصمت استدعاء notify(). استثناءات: عند استخدام NotificationCompat، تنشئ المكتبة قناة افتراضية، ولكن أهميتها دائمًا DEFAULT. يوصى بإنشاء القنوات الخاصة بك دائمًا.
يمكنك تغيير اسم القناة ووصفها وصوتها. لا يمكنك تغيير الأهمية — هذا القرار محمي بواسطة النظام من المطور. إذا كنت تحتاج إلى زيادة الأهمية، قم بإنشاء قناة جديدة بمعرف مختلف واستخدامها للإشعارات الجديدة. يمكن للمستخدم تغيير الأهمية في أي وقت.
استخدم getNotificationChannel وتحقق من الأهمية: إذا كانت القيمة IMPORTANCE_NONE، فالقناة معطلة. يمكنك أيضًا فتح إعدادات القناة في النظام عبر Intent: Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS بمعلمات app_package و channel_id.
لا توجد حدود — Android لا يفرض حداً لعدد القنوات. ولكن يوصى بعدم إنشاء أكثر من 5–10 قناة لتجنب إرهاق المستخدم بالخيارات. الحد الأدنى الأمثل هو 2–3 قنوات: إشعارات حرجة، عادية وتسويقية.
على Android 7.1 (API 25) وأدنى، القنوات غير مدعومة. فئة NotificationChannel متاحة فقط من API 26. للتوافق العكسي، استخدم NotificationCompat والف إنشاء القناة في شرط: if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O).
الملخص
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.
اقرأ أيضًا