Kotlin 中的通知每天在同一时间重复

krk*_*ska 5 android android-notifications kotlin android-studio

我发现的其他 Stackoverflow 代码都不起作用。要么全部都是 Java,要么我太笨而无法让它工作。

如何每天同一时间触发通知?这么基本的东西,我找不到 Kotlin 的任何东西。

ale*_*al1 10

使用此代码安排每天 22:00(或 中的任何其他时间HOUR_TO_SHOW_PUSH)显示通知:

private val alarmManager = context.getSystemService(ALARM_SERVICE) as AlarmManager
private val alarmPendingIntent by lazy {
    val intent = Intent(context, AlarmReceiver::class.java)
    PendingIntent.getBroadcast(context, 0, intent, 0)
}
private const val HOUR_TO_SHOW_PUSH = 22

fun schedulePushNotifications() {
    val calendar = GregorianCalendar.getInstance().apply {
        if (get(Calendar.HOUR_OF_DAY) >= HOUR_TO_SHOW_PUSH) {
            add(Calendar.DAY_OF_MONTH, 1)
        }

        set(Calendar.HOUR_OF_DAY, HOUR_TO_SHOW_PUSH)
        set(Calendar.MINUTE, 0)
        set(Calendar.SECOND, 0)
        set(Calendar.MILLISECOND, 0)
    }

    alarmManager.setRepeating(
        AlarmManager.RTC_WAKEUP,
        calendar.timeInMillis,
        AlarmManager.INTERVAL_DAY,
        alarmPendingIntent
    )
}
Run Code Online (Sandbox Code Playgroud)

它会触发BroadcastReceiver调用AlarmReceiver,所以你也必须实现它:

class AlarmReceiver : BroadcastReceiver() {

    override fun onReceive(context: Context, intent: Intent) {
        showPushNotification() // implement showing notification in this function
    }
}
Run Code Online (Sandbox Code Playgroud)

不要忘记在 AndroidManifest.xml 中注册它:

<receiver android:name="com.your-package-name.AlarmReceiver" android:enabled="true"/>
Run Code Online (Sandbox Code Playgroud)

另请注意,要安排这些通知,您必须调用schedulePushNotifications(),这意味着该应用程序必须在每次重新启动后至少启动一次。如果您希望在重新启动后显示通知而不启动应用程序,请考虑实现BootReceiver在重新启动后立即触发:

class BootReceiver : BroadcastReceiver() {

    override fun onReceive(context: Context, intent: Intent) {
        if (intent.action == "android.intent.action.BOOT_COMPLETED") {
            schedulePushNotifications()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

不要忘记也在 AndroidManifest.xml 中注册它:

<receiver android:name="com.your-package-name.BootReceiver" android:enabled="true">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
            </intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)