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

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

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

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

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

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

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

وقتی Android 8.0 (سطح میانای برنامه‌سازی کاربردی ۲۶) یا بالاتر را هدف‌یابی می‌کنید، باید یک یا چند کانال اعلان را پیاده‌سازی کنید. اگر targetSdkVersion روی ۲۵ یا پایین‌تر تنظیم شده باشد، وقتی برنامه‌تان در Android 8.0 (سطح API 26) یا بالاتر اجرا می‌شود، عملکرد آن مشابه دستگاه‌های دارای Android 7.1 (سطح API 25) یا پایین‌تر است.

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

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

  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 7.1 (میانای برنامه کاربردی سطح ۲۵) یا نسخه‌های پایین‌تر را اجرا می‌کنند، باید برای هر اعلان، بااستفاده از ثابت اولویت از کلاس NotificationCompat، setPriority() را نیز فراخوانی کنید.

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

سطح اهمیت رؤیت‌پذیر برای کاربر اهمیت (Android 8.0 و بالاتر) اولویت (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. با فراخواندن getNotificationChannel() یا getNotificationChannels()، شیء NotificationChannel را دریافت کنید.

  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 جدیدی را با گروه مرتبط کنید.

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