NotificationManagerCompat на Android Oreo
Есть ли способ установить каналы на Android Oreo при использовании NotificationManagerCompat
и NotificationCompat
?
Ответы
Ответ 1
Поскольку NotificationManagerCompat
- это просто класс-оболочка, который облегчает жизнь, вы можете создавать каналы обычно:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val name = getString(R.string.channel_title)
val description = getString(R.string.channel_description)
val importance = NotificationManager.IMPORTANCE_HIGH
val mChannel = NotificationChannel(CHANNEL_ID, name, importance)
mChannel.description = description
mChannel.enableLights(true)
mChannel.lightColor = Color.parseColor("#5B3C88")
mChannel.enableVibration(true)
mChannel.vibrationPattern = longArrayOf(100, 200, 300, 400, 500, 400, 300, 200, 400)
val manager = (context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager)
manager.createNotificationChannel(mChannel)
}
И затем используйте NotificationManagerCompat
при отправке уведомлений, но не забудьте создать уведомление с использованием нового конструктора:
NotificationCompat.Builder(context, CHANNEL_ID)
Ответ 2
Обычно я использую этот класс для управления каналами уведомлений:
class NotificationManager(private val context: Context) {
companion object {
private val CHANNEL_ID = "YOUR_CHANNEL_ID"
private val CHANNEL_NAME = "Your human readable notification channel name"
private val CHANNEL_DESCRIPTION = "description"
}
@RequiresApi(Build.VERSION_CODES.O)
fun getMainNotificationId(): String {
return CHANNEL_ID
}
@RequiresApi(Build.VERSION_CODES.O)
fun createMainNotificationChannel() {
val id = CHANNEL_ID
val name = CHANNEL_NAME
val description = CHANNEL_DESCRIPTION
val importance = android.app.NotificationManager.IMPORTANCE_LOW
val mChannel = NotificationChannel(id, name, importance)
mChannel.description = description
mChannel.enableLights(true)
mChannel.lightColor = Color.RED
mChannel.enableVibration(true)
val mNotificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as android.app.NotificationManager
mNotificationManager.createNotificationChannel(mChannel)
}
}
Тогда вы можете использовать так, как это
fun createNotificationCompatBuilder(context: Context): NotificationCompat.Builder {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
return NotificationCompat.Builder(context, NotificationManager(context).mainNotificationId)
} else {
return NotificationCompat.Builder(context)
}
}
Таким образом, вы можете использовать его в любом месте приложения с подписью, как и раньше, и можете легко изменить его в случае будущих изменений.
Ответ 3
Есть ли способ настроить каналы на Android Oreo при использовании NotificationManagerCompat?
NotificationManagerCompat
теперь поддерживает каналы уведомлений. В новой версии добавлены методы каналов уведомлений в NotificationManagerCompat
, поэтому разработчики могут использовать только NotificationManagerCompat
при работе с уведомлениями.
Для Java включите в файл build.gradle следующее
implementation 'androidx.core:core:1.1.0'
Для Kotlin, включите следующее вместо вышеуказанной зависимости в файл build.gradle
implementation 'androidx.core:core-ktx:1.1.0'
Чтобы отобразить уведомление, вам нужно будет сделать следующее
- Создать и зарегистрировать канал уведомлений.
- Создайте уведомление.
- Показать уведомление
Приведенные ниже фрагменты приведены в Kotlin, но вы также можете использовать Java, если хотите.
1. Создайте и зарегистрируйте канал уведомлений.
Каналы уведомлений обеспечивают общий визуальный и слуховой опыт для уведомлений аналогичного типа. С момента их введения в API 26 теперь вам необходимо установить канал для уведомления, иначе они не будут отображаться в более новых версиях Android.
Поэтому определите вспомогательный метод, как показано ниже, чтобы создать для вас канал уведомлений.
//define your channel id
val CHANNEL_ID = "com.yourpackagename.your_channel_id"
//create notification channel for android Oreo and above devices.
if (Build.VERSION.SDK_INT >= 26) {
val channel = NotificationChannel(CHANNEL_ID , "Your channel name", NotificationManager.IMPORTANCE_DEFAULT)
NotificationManagerCompat.from(this).createNotificationChannel(channel)
}
2. Создайте уведомление.
Используйте NotificationCompat.Builder
, чтобы создать Notificaiton
. Обратите внимание, что CHANNEL_ID передается разработчику.
var builder = NotificationCompat.Builder(this, CHANNEL_ID)
.setSmallIcon(R.drawable.notification_icon)
.setContentTitle("My notification")
.setContentText("Much longer text that cannot fit one line...")
.setStyle(NotificationCompat.BigTextStyle()
.bigText("Much longer text that cannot fit one line..."))
.setPriority(NotificationCompat.PRIORITY_DEFAULT)
3. Показать уведомление
Чтобы сделать уведомление, позвоните NotificationManagerCompat.notify()
, передав ему уникальный идентификатор для уведомления и результат NotificationCompat.Builder.build()
NotificationManagerCompat.from(this).notify(notificationId, builder.build())
Это все :)