Прежде чем мы перейдем к части этого руководства, посвященной кодированию, давайте узнаем, что такое уведомление Android?

Уведомление Android.

Уведомление Android предоставляет краткую своевременную информацию о действии, произошедшем в приложении, даже если оно не запущено. В уведомлении отображается значок, заголовок и некоторое количество текста содержимого.

Свойства уведомлений Android.

Они задаются с помощью объекта NotificationCompat.Builder
Вот несколько примеров свойств, которые я использую в этом проекте:

  • setSmallIcon(): устанавливает значок уведомления.
  • setLargeIcon(): устанавливает значок конца уведомления.
  • setContentTitle(): используется для установки заголовка уведомления.
  • setContentText(): используется для установки текстового сообщения.
  • setContentIntent(): устанавливает намерение уведомления.
  • setAutoCancel(): устанавливает отменяемое свойство уведомления.
  • setPriority(): устанавливает приоритет уведомления.
  • setSound(): используется для установки звука уведомления.

Пример проекта.

Теперь давайте перейдем к главному пункту этого средства массовой информации.

В этом примере мы создадим простой таймер уведомления и сообщение, и щелчок по нему запускает другое действие.

activity_main.xml

Как и в любых других учебниках, давайте начнем с кодирования в activity_main.xml,

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TIMER"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.091"
       android:textAppearance="@style/Base.TextAppearance.AppCompat.Medium"/>

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="112dp"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:text="Notify"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent" />

    <TextView
        android:id="@+id/timer"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="32dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/button" />

</androidx.constraintlayout.widget.ConstraintLayout>

Создайте действие с именем activity_notification_view.xml и добавьте следующий код. Это действие запустится при нажатии на уведомление. TextView используется для отображения сообщения уведомления.

Затем мы создаем другое действие и называем его NotificationView.Kt.

activity_notifcation_view.xml

Закончив создание нового действия, перейдите в activity_notifcation_view.xml, и теперь мы будем кодировать там.

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".NotificationView">

    <TextView
        android:id="@+id/textView2"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="your detail of notification..."
        android:textAppearance="@style/Base.TextAppearance.AppCompat.Medium"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"/>

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.096"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView2"
        app:layout_constraintVertical_bias="0.206"
        android:textAppearance="@style/Base.TextAppearance.AppCompat.Medium"/>

</androidx.constraintlayout.widget.ConstraintLayout>

MainActivity.kt

Теперь добавьте следующий код в класс MainActivity.java. В этом классе нажатие кнопки вызывает метод onCreate(), в котором мы реализуем таймер обратного отсчета, getNotificationChannel для добавления и реализации канала уведомлений и метод displayNotification(), в котором мы реализуем объект NotificationCompat.Builder для установки свойств уведомлений. Метод NotificationManager.notify() используется для отображения уведомления. Класс Intent используется для вызова другого действия (NotificationView.java) при записи уведомления.

package com.adeeva.chores.notificationv2


import android.annotation.SuppressLint
import android.app.NotificationChannel
import android.app.NotificationManager
import android.app.PendingIntent
import android.content.Context
import android.media.RingtoneManager
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.os.CountDownTimer
import android.widget.RemoteViews
import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.NotificationCompat
import com.adeeva.chores.notificationv2.databinding.ActivityMainBinding
import android.content.Intent as Intent


@Suppress("DEPRECATION")
class MainActivity : AppCompatActivity() {

    private var notificationManager: NotificationManager? = null
    private val channel_id = "channel_1"
    private lateinit var binding: ActivityMainBinding
    private lateinit var countDownTimer: CountDownTimer


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
        createNotificationChannel(channel_id, "countdown", "when countdown ends")

        binding.button.setOnClickListener {
            countDownTimer.start()
        }

        countDownTimer = object : CountDownTimer(10000, 100) {
            override fun onTick(p0: Long) {
                binding.timer.text = getString(R.string.time_reamining, p0 / 1000)
            }

            override fun onFinish() {
                displayNotification()
            }
        }
    }

    @SuppressLint("RemoteViewLayout")
    private fun displayNotification() {
        val notificationIntent = Intent(this, NotificationView::class.java)
        val resultPendingIntent = PendingIntent.getActivities(this,1,
            arrayOf(notificationIntent), PendingIntent.FLAG_UPDATE_CURRENT)
        RemoteViews(packageName, R.layout.activity_notification_view)
        val notificationId = 45
        val alarmSound: Uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)
        val notification = NotificationCompat.Builder(this@MainActivity, channel_id)
            .setSmallIcon(R.drawable.ic_noti)
            .setContentTitle("Countdown Timer")
            .setContentText("Your timer has ended")
            .setAutoCancel(true)
            .setSound(alarmSound)
            .setPriority(NotificationCompat.PRIORITY_HIGH)
            .setContentIntent(resultPendingIntent)
            .build()

        notificationManager?.notify(notificationId, notification)

    }

    private fun createNotificationChannel(id: String, name: String, channelDescription: String) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            val importance = NotificationManager.IMPORTANCE_HIGH
            val channel = NotificationChannel(id, name, importance).apply {
                description = channelDescription
            }

            notificationManager?.createNotificationChannel(channel)

        }
    }
}

NotificationView.kt

Класс NotificationView.java получает сообщение уведомления и отображается в TextView.

package com.adeeva.chores.notificationv2

import android.os.Bundle
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity


class NotificationView : AppCompatActivity() {
    var textView: TextView? = null
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_notification_view)
        textView = findViewById(R.id.textView)
        val message = intent.getStringExtra("message")
        with(textView) {
            this?.setText(message)
        }
    }
}

и готово! убедитесь, что вы добавили экспортированный Android, если ваше приложение работает на Android 12 выше, и добавьте привязку представления в build.gradle, чтобы вы могли использовать метод привязки!

Вот коды build.grade и AndroidManifest!

уровень сборки

plugins {
    id 'com.android.application'
    id 'kotlin-android'
}

android {
    compileSdkVersion 32
    buildToolsVersion "32.0.0"

    defaultConfig {
        applicationId "com.adeeva.chores.notificationv2"
        minSdkVersion 24
        targetSdkVersion 32
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    kotlinOptions {
        jvmTarget = '1.8'
    }

    buildFeatures{
        viewBinding = true
    }
}

dependencies {

    implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
    implementation 'androidx.core:core-ktx:1.8.0'
    implementation 'androidx.appcompat:appcompat:1.4.2'
    implementation 'com.google.android.material:material:1.6.1'
    implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
    testImplementation 'junit:junit:4.+'
    androidTestImplementation 'androidx.test.ext:junit:1.1.3'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
}

AndroidМанифест

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.adeeva.chores.notificationv2">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.NotificationV2">
        <activity android:name=".NotificationView"
            android:label="@string/notification_activity"
            android:parentActivityName=".MainActivity">
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value=".MainActivity"/>
        </activity>
        <activity
            android:exported="true"
            android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

Спасибо, что дочитали до конца, надеюсь, это облегчит вам задачу и удачи в вашем путешествии!