Notification Channel (کانال اعلان) — مکانیسمی است در Android که در نسخه 8.0 (API 26) معرفی شد و اعلانها را بر اساس دستهبندی گروهبندی میکند و به کاربر کنترل رفتار آنها را میدهد. هر کانال سطح اهمیت، صدا، لرزش و ظاهر بصری را برای تمام اعلانهای ارسال شده از طریق خود تعیین میکند. طبق Android Developers، NotificationChannel برای همه اعلانها در Android 8+ الزامی است — بدون آن اعلانها نمایش داده نمیشوند.
نکات اصلی
Notification Channel — یک ظرف منطقی برای اعلانهای یک نوع در Android 8+ (Oreo) است. توسعهدهنده کانالی با ID یکتا ایجاد میکند، پارامترهای آن را تنظیم میکند و سپس هر اعلان را با مشخص کردن این کانال ارسال میکند. تمام اعلانهای یک کانال تنظیمات آن را به ارث میبرند.
قبل از Android 8 مدیریت اعلانها دودویی بود: همه یا هیچ. کاربر فقط میتوانست اعلانهای برنامه را کاملاً غیرفعال کند. کانالها این مشکل را حل کردند: اکنون میتوان اعلانهای تبلیغاتی را غیرفعال کرد اما اعلانهای پیام دوستان را حفظ کرد.
پس از ایجاد کانال، اهمیت آن (importance) میتواند در هر لحظه توسط کاربر از طریق تنظیمات → برنامهها → اعلانها تغییر کند. توسعهدهنده نمیتواند پس از ایجاد کانال importance را به صورت برنامهنویسی تغییر دهد — این یک محدودیت امنیتی Android است.
در Android 8+ هر اعلان باید از طریق NotificationChannel ارسال شود. اگر برنامه بخواهد اعلانی را بدون کانال نمایش دهد — سیستم بیصدا آن را نادیده میگیرد. استثنا — اعلانهای از طریق NotificationCompat با کانال پیشفرض که توسط کتابخانه به صورت خودکار ایجاد میشود.
کانال اعلان با مجموعهای از پارامترها تعریف میشود که هنگام ایجاد آن از طریق کلاس NotificationChannel تنظیم میشوند. پارامتر اصلی — سطح اهمیت (importance level) است که نحوه تعامل اعلان با کاربر را تعیین میکند.
پس از ایجاد، کانال در تنظیمات اعلان سیستم ظاهر میشود. کاربر میتواند importance را تغییر دهد، صدا، لرزش را غیرفعال کند یا کانال را کاملاً مسدود کند. تمام تغییرات برای اعلانهای بعدی فوراً اعمال میشوند.
هنگام ایجاد NotificationChannel میتوان تنظیم کرد: صدا (سفارشی یا سیستمی)، لرزش (الگو و مدت)، نشانگر نور (رنگ LED)، نشان (setShowBadge)، قابلیت مشاهده در صفحه قفل (setLockscreenVisibility) و حالت مزاحم نشوید (setBypassDnd). این پارامترها هنگام ایجاد کانال ثابت میشوند و بعداً فقط توسط کاربر قابل تغییر هستند.
سطح اهمیت (importance) — پارامتر اصلی کانال است. تعیین میکند که اعلان صدا پخش کند، روی صفحه ظاهر شود یا فقط در سایه قرار گیرد. اهمیت را با اولویت اشتباه نگیرید — importance توسط کانال تنظیم میشود، در حالی که اولویت (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"
}
}
هنگام ارسال اعلان، ID کانال را از طریق setChannelId (برای NotificationCompat) یا در سازنده Notification.Builder مشخص کنید. اگر کانالی با ID مشخص وجود نداشته باشد — اعلان نمایش داده نمیشود اما خطایی رخ نمیدهد.
Android چندین API برای مدیریت برنامهنویسی کانالها ارائه میدهد: دریافت لیست، حذف و بررسی تنظیمات فعلی. حذف کانال باعث میشود که تمام اعلانهای آن توسط سیستم از تاریخچه حذف شوند.
val manager =
getSystemService(NotificationManager::class.java)
// دریافت لیست همه کانالها
val channels = manager.getNotificationChannels()
channels.forEach { channel ->
Log.d("کانالها", "${channel.id}: ${channel.importance}")
}
// بررسی importance فعلی (کاربر ممکن است تغییر داده باشد)
val channel = manager.getNotificationChannel(CHANNEL_MESSAGES)
if (channel.importance == NotificationManager.IMPORTANCE_NONE) {
// کاربر کانال را غیرفعال کرده است
suggestEnablingChannel()
}
// حذف کانال
manager.deleteNotificationChannel(CHANNEL_PROMO)
پس از ایجاد کانال، توسعهدهنده نمیتواند importance آن را به صورت برنامهنویسی تغییر دهد — این محدودیت Android برای محافظت از کاربر در برابر سوءاستفاده است. اگر نیاز به تغییر اهمیت کانال دارید، یک کانال جدید با ID دیگر ایجاد کنید و اعلانها را منتقل کنید.
اگر نیاز به تغییر اهمیت یک کانال موجود دارید، یک کانال جدید با ID متفاوت (مثلاً “messages_v2”) ایجاد کنید و شروع به ارسال اعلانها به آن کنید. کانال قدیمی را میتوان از طریق deleteNotificationChannel حذف کرد — تمام اعلانهای آن از تاریخچه حذف میشوند. کاربر را از طریق رابط برنامه از مهاجرت مطلع کنید تا تنظیمات خود را از دست ندهد.
NotificationChannelGroup چند کانال را در یک گروه بصری در رابط تنظیمات Android ترکیب میکند. گروهها به کاربر کمک میکنند تا زمانی که برنامه از 5+ کانال استفاده میکند جهتیابی کند: مثلاً “اجتماعی”، “سیستمی”، “بازاریابی”.
گروه از طریق createNotificationChannelGroup ایجاد میشود و هنگام ایجاد کانال از طریق متد setGroup به آن منتقل میشود. حذف گروه همچنین تمام کانالهای آن را حذف میکند. هر کانال فقط میتواند به یک گروه تعلق داشته باشد.
در عمل، گروههای کانال برای برنامههایی با بیش از 3 کانال توصیه میشوند. آنها پیمایش در تنظیمات را سادهتر میکنند و احتمال اینکه کاربر بدون درک لیست کانالها همه اعلانها را یکباره غیرفعال کند کاهش میدهند.
گروه از طریق createNotificationChannelGroup با ID یکتا و نام ایجاد میشود. سپس هر کانال از طریق متد setGroup به گروه متصل میشود. در تنظیمات سیستم، گروه به صورت بخشی با عنوان نمایش داده میشود که زیر آن تمام کانالهای این گروه قرار دارند. اگر گروه حذف شود، تمام کانالهای آن نیز به طور خودکار توسط سیستم بدون امکان بازیابی حذف میشوند.
طراحی صحیح کانالهای اعلان مستقیماً بر تجربه کاربر و retention تأثیر میگذارد. الگوی اصلی — سه سطح اهمیت: کانال بحرانی (IMPORTANCE_HIGH) برای پیامها و تماسها، استاندارد (IMPORTANCE_DEFAULT) برای اعلانهای عمومی و آرام (IMPORTANCE_LOW) برای بازاریابی و اخبار. چنین درجهبندی به کاربر انتخاب قابل فهمی بدون بار اضافی میدهد.
الگوی دوم — کانال بر اساس ماژول عملکردی. هر ماژول بزرگ برنامه (چت، سفارشات، فید، بازاریابی) کانال خود را دریافت میکند. اگر ماژولها بیش از 5 عدد باشند، آنها را در NotificationChannelGroup ترکیب کنید. در تنظیمات سیستم، گروه به صورت بخشی با عناصر قابل پنهان نمایش داده میشود — این کار پیمایش را ساده میکند.
الگوی سوم — کانال برای توسعهدهنده. یک کانال جداگانه با IMPORTANCE_MIN برای اعلانهای اشکالزدایی و سرویس ایجاد کنید. کاربران آنها را در پرده نخواهند دید، اما توسعهدهنده میتواند لاگها را از طریق adb تحلیل کند. در Production این کانال را میتوان حذف یا از طریق Intent از رابط کاربری پنهان کرد.
الگوی چهارم — بازخورد درباره کانالها. به کاربر در رابط نشان دهید چه کانالهایی فعال هستند و importance فعلی آنها چقدر است. در Android 8+ میتوان وضعیت کانال را از طریق getNotificationChannel دریافت کرد و اگر کانال غیرفعال است به کاربر پیشنهاد تغییر تنظیمات داد. این به ویژه برای عملکردهای حیاتی برنامه مهم است.
سوالات متداول
اعلان نمایش داده نمیشود نه در پرده و نه در سایه. سیستم فراخوانی notify() را بیصدا نادیده میگیرد. استثناها: هنگام استفاده از NotificationCompat کتابخانه یک کانال پیشفرض ایجاد میکند اما importance آن همیشه DEFAULT است. توصیه میشود همیشه کانالهای خود را ایجاد کنید.
میتوان نام، توضیحات و صدای کانال را تغییر داد. Importance قابل تغییر نیست — این تصمیم توسط سیستم از توسعهدهنده محافظت میشود. اگر نیاز به افزایش اهمیت دارید — یک کانال جدید با ID دیگر ایجاد کنید و از آن برای اعلانهای جدید استفاده کنید. کاربر میتواند importance را در هر لحظه تغییر دهد.
از getNotificationChannel استفاده کنید و importance را بررسی کنید: اگر مقدار برابر 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 از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید