Kotlin 在 Android 中电池电量低于 10% 时显示通知

问题描述

如果 Kotlin 使用广播接收器在 Android 工作室中电池电量低于 10%,我如何显示通知

解决方法

在清单中添加权限。注册您的广播接收器。在本教程中阅读更多内容 https://developer.android.com/training/monitoring-device-state/battery-monitoring

,

用这个创建一个新的 Android 项目

将 AndroidX 支持库添加到您的模块的 build.gradle(其他 implementation 的位置:

dependencies {
    implementation 'androidx.core:core-ktx:1.3.2'
}

MainActivity.kt 导入:

import android.app.NotificationChannel
import android.app.NotificationManager
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.os.BatteryManager
import android.os.Build
import android.os.Bundle
import androidx.annotation.RequiresApi
import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.NotificationCompat
import kotlin.concurrent.thread

MainActivity.kt:

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        thread {
            val mNotificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager

            val mChannel = NotificationChannel("default","default",NotificationManager.IMPORTANCE_DEFAULT)
            mNotificationManager.createNotificationChannel(mChannel)

            while (true) {
                val batteryStatus: Intent? = IntentFilter(Intent.ACTION_BATTERY_CHANGED).let { ifilter ->
                    this.registerReceiver(null,ifilter)
                }
                val batteryPct: Float = batteryStatus?.let { intent ->
                    val level: Int = intent.getIntExtra(BatteryManager.EXTRA_LEVEL,-1)
                    val scale: Int = intent.getIntExtra(BatteryManager.EXTRA_SCALE,-1)
                    level * 100 / scale.toFloat()
                } ?: 100f

                if (batteryPct <= 10) {
                    val notif = NotificationCompat.Builder(this,"default").setContentText("Low Battery: ${batteryPct.toInt()}%").setSmallIcon(R.drawable.ic_launcher_foreground).build()
                    mNotificationManager.notify(1,notif)  // re-use notification in tray
                }

                Thread.sleep(20000)  // check every 20 seconds
            }
        }
    }
}