📜  Kotlin 中的 Android 进度通知

📅  最后修改于: 2022-05-13 01:55:39.436000             🧑  作者: Mango

Kotlin 中的 Android 进度通知

在本教程中,您将学习如何使用 Kotlin 为 Android 创建一个基本的进度通知(不确定进度指示器和固定持续时间进度指示器)

在开始之前,让我们先了解一下 Android 中 Notification 的组成部分。
\\*

\\*

  1. 小图标-必需,可以使用setSmallIcon() 设置。
  2. 应用程序名称-由系统提供。
  3. 时间戳-由系统提供,但可以被覆盖。
  4. 大图标-可选,可以使用setLargeIcon() 设置。
  5. Title可选,可以使用setContentTitle() 设置。
  6. Text可选,可以使用setContentText() 设置。

注意:通知渠道
自 Android 版本 8 (Android Oreo) 推出以来,现在必须将所有通知分类到称为“频道”的类别中,这是为了方便用户和开发人员。
下图向我们展示了一个名为“进度通知”的通知通道。
\\*

\\*
由于我们只需要创建一次频道,我们将使用一个帮助类“App.kt”来完成工作。

应用程序.kt

package com.gfg.progressnotificationdemo
   
import android.app.Application
import android.app.NotificationChannel
import android.app.NotificationManager
import android.os.Build
   
class App : Application(){
    val channelId = "Progress Notification" as String
   
    override fun onCreate(){
        super.onCreate()
        createNotificationChannels()
    }
       
    //Check if the Android version is greater than 8. (Android Oreo)
    private fun createNotificationChannels(){
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            val channel1 = NotificationChannel(
                channelId,
                "Progress Notification",
    //IMPORTANCE_HIGH = shows a notification as peek notification.
    //IMPORTANCE_LOW = shows the notification in the status bar.
                NotificationManager.IMPORTANCE_HIGH
            )
            channel1.description = "Progress Notification Channel"
            val manager = getSystemService(
                NotificationManager::class.java
            )
            manager.createNotificationChannel(channel1)
        }
    }
}

\\*
现在,在主活动中,我们将使用一个线程来调用通知。
\\*

MainActivity.kt

package com.gfg.progressnotificationdemo
   
import android.app.PendingIntent
import android.content.Intent
import android.os.Bundle
import android.os.SystemClock
import android.view.View
import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.NotificationCompat
import androidx.core.app.NotificationManagerCompat
import com.gfg.progressnotificationdemo.R.drawable
   
   
class MainActivity : AppCompatActivity(){
   
    private lateinit var notificationManager: NotificationManagerCompat
    val channelId = "Progress Notification" as String
   
    override fun onCreate(savedInstanceState: Bundle?){
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
   
    //Create a Notification Manager
        notificationManager = NotificationManagerCompat.from(this)
   
    }
   
    //Start() is called when the buttons is pressed.
    public fun start(view: View){
   
        val intent = Intent(this, MainActivity::class.java).apply{
            flags = Intent.FLAG_ACTIVITY_NEW_TASK or 
            Intent.FLAG_ACTIVITY_CLEAR_TASK
        }
   
        val pendingIntent: PendingIntent = PendingIntent.getActivity(
         this, 0, intent, 0)
   
    //Sets the maximum progress as 100
        val progressMax = 100
    //Creating a notification and setting its various attributes
        val notification =
            NotificationCompat.Builder(this, channelId)
                .setSmallIcon(drawable.ic_file_download)
                .setContentTitle("GeeksforGeeks")
                .setContentText("Downloading")
                .setPriority(NotificationCompat.PRIORITY_LOW)
                .setOngoing(true)
                .setOnlyAlertOnce(true)
                .setProgress(progressMax, 0, true)
                .setContentIntent(pendingIntent)
                .setAutoCancel(true)
   
    //Initial Alert
        notificationManager.notify(1, notification.build())
   
        Thread(Runnable{
            SystemClock.sleep(2000)
            var progress = 0
            while (progress <= progressMax) {
                SystemClock.sleep(
                    1000
                )
                progress += 20
    //Use this to make it a Fixed-duration progress indicator notification
   
    //notification.setContentText(progress.toString()+"%")
    //.setProgress(progressMax, progress, false)
   
    //notificationManager.notify(1, notification.build())
            }
      
            notification.setContentText("Download complete")
                .setProgress(0, 0, false)
                .setOngoing(false)
            notificationManager.notify(1, notification.build())
        }).start()
    }
}

活动主.xml

布局由一个按钮组成。



   
    

\\*

输出:

  • 固定持续时间进度指示器:(在 MainActivity.kt 第 67 行的注释中添加代码后)
    \\*
  • 不确定的进度指示器:
    \\*
  • 下载后:
    \\*

这就是使用 Kotlin 向 Android 中的通知添加进度指示器是多么容易和简单。