fbpx

Создание PendingIntent

Создание PendingIntent

В этом уроке вы познакомитесь с таким понятием как PendingIntent. Что это такое?

PendingIntent используется для описания интента, выполнение которого отложено во времени. Инстанс класса PendingIntent создается одним из статических методов: PendingIntent.getActivity(), PendingIntent.getActivities(),PendingIntent.getBroadcast(), PendingIntent.getService().

При создании в PendingIntent записывается информация о желаемом интенте и о том, какой компонент будет запущен.
Объекты PendingIntent переживают остановку процесса, поэтому система может использовать PendingIntent для старта приложения.

Один из частых примеров использования PendingIntent – это создание нотификации. Метод NotificationCompat.Builder.setContentIntent()   принимает PendingIntent, который выполняется, когда пользователь кликает на нотификацию и таким образом мы можем перевести пользователя на главный экран нашего приложения или любой другой нужный экран. Для этого давайте добавим в ранее описанный метод createSampleDataNotification()  следующий код:

fun createSampleDataNotification(
    context: Context, title: String, message: String,
    bigText: String, autoCancel: Boolean
) {

    // Это описано в предыдущем уроке
    val channelId = "${context.packageName}-${context.getString(R.string.app_name)}"
   
    val notificationBuilder = NotificationCompat.Builder(context, channelId).apply {
        setSmallIcon(R.drawable.ic_fitnes) 
        setContentTitle(title) 
        setContentText(message) 
        setAutoCancel(autoCancel) 
        setStyle(NotificationCompat.BigTextStyle().bigText(bigText)) 
        priority = NotificationCompat.PRIORITY_DEFAULT 

        // Создаём Intent и PendingIntent для открытия главного экрана
        val intent = Intent(context, MainActivity::class.java) // 1
        intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK // 2
        val pendingIntent = PendingIntent.getActivity(context, 0, intent, 0) // 3
        setContentIntent(pendingIntent) // 4
    }

    val notificationManager = NotificationManagerCompat.from(context)
    notificationManager.notify(1001, notificationBuilder.build())
}

Строки, отмеченные цифрами с 1 по 4 – используются для создания PendingIntent. Давайте рассмотрим этот код подробнее:

  1. Создаём  Intent для запуска главного экрана, то есть MainActivity.
  2. Устанавливаем флаги для режима launchMode в котором будет запущено приложение. Наглядно о launchMode рассказано тут 
  3. Оборачиваем Intent  в  PendingIntent, используя метод getActivity() для получения Activity которую необходимо запустить.
  4. Вызываем метод setContentIntent() для передачи созданного PendingIntent в NotificationCompat.Builder чтобы вызвать его при нажатии на уведомление пользователем.

Отображение уведомления

Теперь осталось добавить код, который покажет уведомление. Для этого в этот же метод createSampleDataNotification() добавьте в самый конец следующий код:

// 1
val notificationManager = NotificationManagerCompat.from(context)
// 2
notificationManager.notify(1001, notificationBuilder.build())

Тут мы получаем ссылку на NotificationManagerCompat и вызываем метод notify() для отображения уведомления, где 1001 – это просто некий id, который является обязательным, а notificationBuilder.build() – создаёт в итоге уведомление, которое мы так тщательно конструировали.

Отличная работа! Теперь давайте запустим наш метод и проверим его работу. Для этого добавьте вызов метода createSampleDataNotification() в обработчик для Floating Action Button

Для этого откройте класс FirstFragment и добавьте следующий код

fab.setOnClickListener {
      NotificationHelper.createSampleDataNotification(
          view.context, "Супер Уведомление", "Это уведомление для провеки", "", true
      )
      findNavController().navigate(R.id.action_FirstFragment_to_SecondFragment)
  }

Теперь, по нажатию на кнопку, помимо перехода на следующий фрагмент у нас появится уведомление как показано ниже на скриншоте. Нажав на него,  вы перейдёте на главный экран приложения.

Отличная работа! Вы познакомились с такими понятиями как PendingIntent, каналы для уведомлений, создали своё уведомление и теперь вы готовы двигаться дальше. В следующих уроках мы разработаем экран для добавления напоминания о тренировке и реализуем механизм автоматических уведомлений по расписанию с помощью AlarmManager

Всё, что мы сейчас сделали вы можете найти в ветке на Github  ветка называется feature/02-created-sample-notification