Прежде чем мы перейдем к части этого руководства, посвященной кодированию, давайте узнаем, что такое уведомление 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>
Спасибо, что дочитали до конца, надеюсь, это облегчит вам задачу и удачи в вашем путешествии!