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

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

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

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

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

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

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

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

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

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

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

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

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

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

Kotlin

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)
}

Java

private void createNotificationChannel() {
    // Create the NotificationChannel, but only on API 26+ because
    // the NotificationChannel class is not in the Support Library.
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        CharSequence name = getString(R.string.channel_name);
        String description = getString(R.string.channel_description);
        int importance = NotificationManager.IMPORTANCE_DEFAULT;
        NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, importance);
        channel.setDescription(description);
        // Register the channel with the system. You can't change the importance
        // or other notification behaviors after this.
        NotificationManager notificationManager = getSystemService(NotificationManager.class);
        notificationManager.createNotificationChannel(channel);
    }
}

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

تستخدم جميع الإشعارات المنشورة في قناة معيّنة تلقائيًا السلوكيات المرئية والسمعية المحدّدة حسب مستوى الأهمية من الفئة 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.

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

Kotlin

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

Java

Intent intent = new Intent(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS);
intent.putExtra(Settings.EXTRA_APP_PACKAGE, getPackageName());
intent.putExtra(Settings.EXTRA_CHANNEL_ID, myNotificationChannel.getId());
startActivity(intent);

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

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

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

Kotlin

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

Java

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

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

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

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

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

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

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

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

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

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

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

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

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

Kotlin

// 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
notificationManager.createNotificationChannelGroup(NotificationChannelGroup(groupId, groupName))

Java

// The id of the group.
String groupId = "my_group_01";
// The user-visible name of the group.
CharSequence groupName = getString(R.string.group_name);
NotificationManager notificationManager =
        (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.createNotificationChannelGroup(new NotificationChannelGroup(groupId, groupName));

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

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