ایجاد و مدیریت کانال‌های اعلان

از Android نسخه ۸.۰ (سطح میانای برنامه‌سازی کاربردی ۲۶) به بعد، همه اعلان‌ها باید به یک کانال اختصاص داده شوند. برای هر کانال، می‌توانید رفتار دیداری و شنیداری‌ای را تنظیم کنید که برای همه اعلان‌های آن کانال اعمال می‌شود. کاربران می‌توانند این تنظیمات را تغییر دهند و تصمیم بگیرند که کدام کانال‌های اعلان از برنامه شما می‌تواند مزاحم یا قابل‌مشاهده باشد.

برای نمای کلی کانال‌ها و دیگر ویژگی‌های اعلان در Android 8.0، ویدیو زیر را ببینید.

تنظیمات کاربر برای کانال‌های اعلان برای هر برنامه در تنظیمات سیستم دردسترس است، همان‌طور که در شکل ۱ نشان داده شده است.

شکل ۱. تنظیمات اعلان برای برنامه «ساعت» و یکی از کانال‌های آن.

پس‌از ایجاد کانال اعلان، نمی‌توانید رفتارهای اعلان را تغییر دهید. در این مرحله، کاربر کنترل کامل دارد. اما همچنان می‌توانید نام و شرح کانال را تغییر دهید.

برای هر نوع اعلانی که باید ارسال کنید، کانالی ایجاد کنید. همچنین می‌توانید کانال‌های اعلان ایجاد کنید تا انتخاب‌های کاربران را منعکس کنید. برای مثال، می‌توانید برای هر گروه مکالمه‌ای که کاربر در برنامه پیام‌رسانی ایجاد کرده است، کانال‌های اعلان جداگانه‌ای راه‌اندازی کنید.

وقتی Android نسخه ۸.۰ (سطح میانای برنامه کاربردی ۲۶) یا بالاتر را هدف‌یابی می‌کنید، باید یک یا چند کانال اعلان پیاده‌سازی کنید. اگر targetSdkVersion روی ۲۵ یا پایین‌تر تنظیم شده باشد، وقتی برنامه‌تان در Android نسخه ۸.۰ (سطح میانای برنامه‌سازی کاربردی ۲۶) یا بالاتر اجرا می‌شود، رفتاری مشابه دستگاه‌های دارای Android نسخه ۷.۱ (سطح میانای برنامه‌سازی کاربردی ۲۵) یا پایین‌تر خواهد داشت.

ایجاد کانال اعلان

برای ایجاد کانال اعلان، این مراحل را دنبال کنید:

  1. یک شیء NotificationChannel با شناسه کانال منحصربه‌فرد، نام قابل‌مشاهده برای کاربر، و سطح اهمیت بسازید.

  2. درصورت تمایل، شرحی را که کاربر در تنظیمات سیستم می‌بیند با setDescription() مشخص کنید.

  3. کانال اعلان را با ارسال آن به createNotificationChannel() ثبت کنید.

مثال زیر نحوه ایجاد و ثبت کانال اعلان را نشان می‌دهد:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    // Create the NotificationChannel.
    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 =
        context.getSystemService(NotificationManager::class.java)
    notificationManager?.createNotificationChannel(mChannel)
}

بازآفرینی کانال اعلان موجود با مقادیر اصلی آن هیچ عملیاتی انجام نمی‌دهد، بنابراین فراخوانی این کد هنگام راه‌اندازی برنامه ایمن است.

به‌طور پیش‌فرض، همه اعلان‌های پست‌شده در کانال مشخصی از رفتارهای دیداری و شنیداری تعریف‌شده توسط سطح اهمیت از کلاس NotificationManagerCompat، مانند IMPORTANCE_DEFAULT یا IMPORTANCE_HIGH استفاده می‌کنند. برای اطلاعات بیشتر درباره سطوح اهمیت، بخش بعدی را ببینید.

اگر می‌خواهید رفتارهای اعلان پیش‌فرض کانالتان را بیشتر سفارشی‌سازی کنید، می‌توانید روش‌هایی مثل enableLights()، setLightColor()، و setVibrationPattern() را در NotificationChannel فراخوانی کنید. به‌خاطر داشته باشید که پس‌از ایجاد کانال، نمی‌توانید این تنظیمات را تغییر دهید و کاربر کنترل نهایی را بر فعال بودن این رفتارها دارد.

همچنین می‌توانید با فراخوانی createNotificationChannels()، چندین کانال اعلان را در یک عملیات ایجاد کنید.

تنظیم سطح اهمیت

اهمیت کانال بر سطح وقفه همه اعلان‌های پست‌شده در کانال تأثیر می‌گذارد. آن را در سازنده NotificationChannel بااستفاده از یکی از پنج سطح اهمیت، از IMPORTANCE_NONE(0) تا IMPORTANCE_HIGH(4) مشخص کنید.

برای پشتیبانی از دستگاه‌هایی که Android نسخه ۷.۱ (میانای برنامه‌سازی کاربردی سطح ۲۵) یا پایین‌تر را اجرا می‌کنند، باید setPriority() را نیز برای هر اعلان بااستفاده از ثابت اولویت از کلاس NotificationCompat فراخوانی کنید.

ثابت‌های اهمیت (NotificationManager.IMPORTANCE_*) و اولویت (NotificationCompat.PRIORITY_*) با گزینه‌های اهمیت قابل‌مشاهده برای کاربر مطابقت دارند، همان‌طور که در جدول زیر نشان داده شده است.

سطح اهمیت قابل‌مشاهده برای کاربر اهمیت (Android نسخه ۸.۰ و بالاتر) اولویت (Android 7.1 و پایین‌تر)
فوری
صدا پخش می‌کند و به‌عنوان اعلان هشدار نشان داده می‌شود.
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, context.packageName)
    putExtra(Settings.EXTRA_CHANNEL_ID, CHANNEL_ID)
}
Button(onClick = {
    context.startActivity(intent)
}) {
    Text("Open Channel Settings")
}

توجه داشته باشید که این هدف به دو مورد اضافی نیاز دارد که نام بسته برنامه‌تان (که با نام شناسه برنامه نیز شناخته می‌شود) و کانال موردنظر برای ویرایش را مشخص می‌کند.

حذف کانال اعلان

می‌توانید کانال‌های اعلان را با فراخوانی deleteNotificationChannel() حذف کنید. نمونه کد زیر نحوه تکمیل این فرایند را نشان می‌دهد:

val notificationManager =
    ContextCompat.getSystemService<NotificationManager>(context, NotificationManager::class.java)
notificationManager?.deleteNotificationChannel(channelId)

ایجاد گروه کانال اعلان

اگر می‌خواهید ظاهر کانال‌هایتان را در واسط کاربر تنظیمات بیشتر سازمان‌دهی کنید، می‌توانید گروه‌های کانال ایجاد کنید. اگر برنامه‌تان از چند حساب کاربری پشتیبانی می‌کند، این ایده خوبی است زیرا به شما امکان می‌دهد برای هر حساب یک گروه کانال اعلان ایجاد کنید. گروه‌های کانال به کاربران کمک می‌کنند چندین کانال اعلان را که نام‌های یکسان دارند از هم تشخیص دهند و آن‌ها را کنترل کنند.

شکل ۲. تنظیمات کانال اعلان با گروه‌های حساب‌های شخصی و کاری.

برای مثال، یک برنامه شبکه‌سازی اجتماعی ممکن است از حساب‌های شخصی و کاری پشتیبانی کند. در این سناریو، هر حساب ممکن است به چندین کانال اعلان با عملکردها و نام‌های یکسان نیاز داشته باشد، مانند موارد زیر:

  • یک حساب شخصی با دو کانال:

    • نظرات جدید

    • توصیه‌های پست

  • یک حساب کسب‌وکار با دو کانال:

    • نظرات جدید

    • توصیه‌های پست

سازمان‌دهی کانال‌های اعلان در گروه‌هایی برای هر حساب به کاربران امکان می‌دهد آن‌ها را از یکدیگر تشخیص دهند.

هر گروه کانال اعلان به یک شناسه نیاز دارد که باید در بسته شما منحصربه‌فرد باشد، و همچنین به نامی که برای کاربر قابل‌مشاهده باشد. قطعه کد زیر نحوه ایجاد گروه کانال اعلان را نشان می‌دهد.

fun createNotificationChannelGroup(context: Context, groupId: String, groupName: String) {
    val notificationManager =
        ContextCompat.getSystemService(context, NotificationManager::class.java)
    notificationManager?.createNotificationChannelGroup(NotificationChannelGroup(groupId, groupName))
}

پس‌از ایجاد گروه جدید، می‌توانید setGroup() را فراخوانی کنید تا شیء NotificationChannel جدیدی را با گروه مرتبط کنید.

وقتی کانال را به مدیر اعلان ارسال کردید، نمی‌توانید ارتباط بین کانال اعلان و گروه را تغییر دهید.