إنشاء قنوات الإشعارات وإدارتها

بدءًا من الإصدار 8.0 من نظام التشغيل Android (المستوى 26 من واجهة برمجة التطبيقات)، يجب تعيين جميع الإشعارات لقناة. يمكنك ضبط السلوك المرئي والسمعي لكل قناة، ويتم تطبيقه على جميع الإشعارات في تلك القناة. يمكن للمستخدمين تغيير هذه الإعدادات وتحديد قنوات الإشعارات من تطبيقك التي يمكن أن تكون مزعجة أو مرئية.

يمكنك مشاهدة الفيديو التالي للحصول على نظرة عامة على القنوات وميزات الإشعارات الأخرى في الإصدار 8.0 من نظام التشغيل Android.

تتوفّر إعدادات المستخدم لقنوات الإشعارات لكل تطبيق في إعدادات النظام، كما هو موضّح في الشكل 1.

الشكل 1: إعدادات الإشعارات لتطبيق "الساعة" وإحدى قنواته

بعد إنشاء قناة إشعارات، لا يمكنك تغيير سلوكيات الإشعارات. ويكون للمستخدم تحكّم كامل في هذه المرحلة. ومع ذلك، سيظل بإمكانك تغيير اسم القناة ووصفها.

أنشئ قناة لكل نوع من أنواع الإشعارات التي تحتاج إلى إرسالها. يمكنك أيضًا إنشاء قنوات إشعارات تعكس الخيارات التي يحدّدها المستخدمون. على سبيل المثال، يمكنك إعداد قنوات إشعارات منفصلة لكل مجموعة محادثات ينشئها مستخدم في تطبيق مراسلة.

عند استهداف الإصدار 8.0 من نظام التشغيل Android (المستوى 26 من واجهة برمجة التطبيقات) أو الإصدارات الأحدث، يجب تنفيذ قناة إشعارات واحدة أو أكثر. إذا تم ضبط targetSdkVersion على 25 أو أقل، سيتصرف تطبيقك على الإصدار 8.0 من نظام التشغيل Android (مستوى واجهة برمجة التطبيقات 26) أو الإصدارات الأحدث بالطريقة نفسها التي يتصرف بها على الأجهزة التي تعمل بالإصدار 7.1 من نظام التشغيل Android (مستوى واجهة برمجة التطبيقات 25) أو الإصدارات الأقدم.

إنشاء قناة إشعارات

لإنشاء قناة إشعارات، اتّبِع الخطوات التالية:

  1. أنشئ عنصر NotificationChannel باستخدام معرّف قناة فريد، اسم مرئي للمستخدم ومستوى أهمية.

  2. يمكنك اختياريًا تحديد الوصف الذي يراه المستخدم في إعدادات النظام باستخدام setDescription().

  3. سجِّل قناة الإشعارات عن طريق تمريرها إلى createNotificationChannel().

يوضّح المثال التالي كيفية إنشاء قناة إشعارات وتسجيلها:

  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
      // Create the NotificationChannel.
      val name = getString(R.string.channel_name)
      val descriptionText = getString(R.string.channel_description)
      val importance = NotificationManager.IMPORTANCE_DEFAULT
      val mChannel = NotificationChannel(CHANNEL_ID, name, importance)
      mChannel.description = descriptionText
      // Register the channel with the system. You can't change the importance
      // or other notification behaviors after this.
      val notificationManager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager
      notificationManager.createNotificationChannel(mChannel)
  }

لا يؤدي إعادة إنشاء قناة إشعارات حالية باستخدام قيمها الأصلية إلى تنفيذ أي عملية، لذا من الآمن استدعاء هذا الرمز البرمجي عند بدء تشغيل تطبيق.

تلقائيًا، تستخدم جميع الإشعارات المنشورة في قناة معيّنة السلوكيات المرئية والسمعية المحدّدة حسب مستوى الأهمية من فئة NotificationManagerCompat، مثل IMPORTANCE_DEFAULT أو IMPORTANCE_HIGH. راجِع القسم التالي لمزيد من المعلومات عن مستويات الأهمية.

إذا أردت تخصيص سلوكيات الإشعارات التلقائية لقناتك بشكل أكبر، يمكنك استدعاء طرق مثل enableLights() وsetLightColor() وsetVibrationPattern() على NotificationChannel. تذكَّر أنّه بعد إنشاء القناة، لا يمكنك تغيير هذه الإعدادات، ويتحكّم المستخدم بشكل نهائي في ما إذا كانت هذه السلوكيات نشطة أم لا.

يمكنك أيضًا إنشاء قنوات إشعارات متعددة في عملية واحدة عن طريق استدعاء createNotificationChannels().

ضبط مستوى الأهمية

تؤثّر أهمية القناة في مستوى المقاطعة لجميع الإشعارات المنشورة في القناة. حدِّدها في أداة إنشاء NotificationChannel، باستخدام أحد مستويات الأهمية الخمسة، بدءًا من IMPORTANCE_NONE(0) إلى IMPORTANCE_HIGH(4).

لدعم الأجهزة التي تعمل بالإصدار 7.1 من نظام التشغيل Android (المستوى 25 من واجهة برمجة التطبيقات) أو الإصدارات الأقدم، يجب أيضًا استدعاء setPriority() لكل إشعار، باستخدام ثابت أولوية من فئة NotificationCompat.

تتطابق ثوابت الأهمية (NotificationManager.IMPORTANCE_*) والأولوية (NotificationCompat.PRIORITY_*) مع خيارات الأهمية المرئية للمستخدم، كما هو موضّح في الجدول التالي.

مستوى الأهمية المرئي للمستخدم الأهمية (الإصدار 8.0 من نظام التشغيل Android والإصدارات الأحدث) الأولوية (الإصدار 7.1 من نظام التشغيل Android والإصدارات الأقدم)
عاجل
يصدر صوتًا ويظهر كإشعار منبثق.
IMPORTANCE_HIGH PRIORITY_HIGH أو PRIORITY_MAX
عالية
يصدر صوتًا.
IMPORTANCE_DEFAULT PRIORITY_DEFAULT
متوسطة
لا يصدر صوتًا.
IMPORTANCE_LOW PRIORITY_LOW
منخفضة
لا يصدر صوتًا ولا يظهر في شريط الحالة.
IMPORTANCE_MIN PRIORITY_MIN
بدون
لا يصدر صوتًا ولا يظهر في شريط الحالة أو الخيار المنسدل.
IMPORTANCE_NONE N/A

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

بعد إرسال القناة إلى NotificationManager، لا يمكنك تغيير مستوى الأهمية. ومع ذلك، يمكن للمستخدم تغيير إعداداته المفضّلة لقنوات تطبيقك في أي وقت.

للحصول على معلومات عن اختيار مستوى أولوية مناسب، راجِع "مستويات الأولوية" في الـ دليل تصميم الإشعارات.

قراءة إعدادات قناة الإشعارات

يمكن للمستخدمين تعديل إعدادات قنوات الإشعارات، بما في ذلك السلوكيات مثل الاهتزاز وصوت التنبيه. إذا أردت معرفة الإعدادات التي يطبّقها المستخدم على قنوات الإشعارات، اتّبِع الخطوات التالية:

  1. احصل على عنصر NotificationChannel عن طريق استدعاء getNotificationChannel() أو getNotificationChannels().

  2. استعلم عن إعدادات قناة معيّنة، مثل getVibrationPattern() و getSound() وgetImportance().

إذا رصدت إعدادًا لقناة تعتقد أنّه يمنع السلوك المقصود لتطبيقك، يمكنك اقتراح أن يغيّره المستخدم وتقديم إجراء لفتح إعدادات القناة، كما هو موضّح في القسم التالي.

فتح إعدادات قناة الإشعارات

بعد إنشاء قناة إشعارات، لا يمكنك تغيير السلوكيات المرئية والسمعية لقناة الإشعارات آليًا. يمكن للمستخدم فقط تغيير سلوكيات القناة من إعدادات النظام. لتزويد المستخدمين بإمكانية الوصول السريع إلى إعدادات الإشعارات هذه، أضِف عنصرًا في واجهة مستخدم إعدادات تطبيقك يفتح إعدادات النظام هذه.

يمكنك فتح إعدادات النظام لقنوات الإشعارات باستخدام Intent يستخدِم الإجراء ACTION_CHANNEL_NOTIFICATION_SETTINGS.

على سبيل المثال، يوضّح نموذج الرمز البرمجي التالي كيف يمكنك إعادة توجيه المستخدم إلى إعدادات قناة إشعارات:

  val intent = Intent(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS).apply {
      putExtra(Settings.EXTRA_APP_PACKAGE, packageName)
      putExtra(Settings.EXTRA_CHANNEL_ID, myNotificationChannel.getId())
  }
  startActivity(intent)

يُرجى العِلم أنّ الهدف يتطلّب إضافتَين تحدّدان اسم حزمة تطبيقك (المعروف أيضًا باسم معرّف التطبيق) والقناة التي تريد تعديلها.

حذف قناة إشعارات

يمكنك حذف قنوات الإشعارات عن طريق استدعاء deleteNotificationChannel(). يوضّح نموذج الرمز البرمجي التالي كيفية إكمال هذه العملية:

  // The id of the channel.
  val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
  val id: String = "my_channel_01"
  notificationManager.deleteNotificationChannel(id)

إنشاء مجموعة قنوات إشعارات

إذا أردت تنظيم مظهر قنواتك بشكل أكبر في واجهة مستخدم الإعدادات، يمكنك إنشاء مجموعات قنوات. هذه فكرة جيدة عندما يتيح تطبيقك حسابات مستخدمين متعددة لأنّها تسمح لك بإنشاء مجموعة قنوات إشعارات لكل حساب. تساعد مجموعات القنوات المستخدمين في التمييز بين قنوات الإشعارات المتعددة التي تحمل أسماء متطابقة والتحكّم فيها.

الشكل 2: إعدادات قنوات الإشعارات مع مجموعات للحسابات الشخصية وحسابات العمل

على سبيل المثال، قد يتضمّن تطبيق شبكة اجتماعية دعمًا للحسابات الشخصية وحسابات العمل. في هذا السيناريو، قد يتطلب كل حساب قنوات إشعارات متعددة لها وظائف وأسماء متطابقة، مثل ما يلي:

  • حساب شخصي يتضمّن قناتَين:

    • تعليقات جديدة

    • اقتراحات بشأن مشاركات

  • حساب تجاري يتضمّن قناتَين:

    • تعليقات جديدة

    • اقتراحات بشأن مشاركات

يسمح تنظيم قنوات الإشعارات في مجموعات لكل حساب للمستخدمين بالتمييز بينها.

تتطلب كل مجموعة قنوات إشعارات معرّفًا يجب أن يكون فريدًا ضمن حزمتك، بالإضافة إلى اسم مرئي للمستخدم. يوضّح المقتطف التالي كيفية إنشاء مجموعة قنوات إشعارات.

  // The id of the group.
  val groupId = "my_group_01"
  // The user-visible name of the group.
  val groupName = getString(R.string.group_name)
  val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
  <b>notificationManager.createNotificationChannelGroup(NotificationChannelGroup(groupId, groupName))</b>

بعد إنشاء مجموعة جديدة، يمكنك استدعاء setGroup() لربط عنصر NotificationChannel جديد بالمجموعة.

بعد إرسال القناة إلى مدير الإشعارات، لا يمكنك تغيير الربط بين قناة الإشعارات والمجموعة.