提醒通知未显示

问题描述 投票:0回答:1

我编写了一个应用程序,旨在创建有关用户输入的内容的通知。它应在先前指定的日期和时间显示在设备屏幕上。当应用程序未打开时,也应该显示警报。不幸的是,尽管设置了提醒,但消息窗口从未出现。

MainActivity.kt

package com.example.kalendarz_2

import android.app.AlarmManager
import android.app.DatePickerDialog
import android.app.NotificationChannel
import android.app.NotificationManager
import android.app.PendingIntent
import android.app.TimePickerDialog
import android.content.Context
import android.content.Intent
import android.os.Build
import android.os.Bundle
import android.view.View
import android.widget.Button
import android.widget.DatePicker
import android.widget.EditText
import android.widget.TimePicker
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import java.util.*

class MainActivity : AppCompatActivity() {

    private lateinit var btnSetReminder: Button
    private lateinit var etReminderText: EditText

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        btnSetReminder = findViewById(R.id.btnSetReminder)
        etReminderText = findViewById(R.id.etReminderText)
        
    }

    fun showDateTimePicker(view: View) {
        val calendar = Calendar.getInstance()
        val initialYear = calendar.get(Calendar.YEAR)
        val initialMonth = calendar.get(Calendar.MONTH)
        val initialDay = calendar.get(Calendar.DAY_OF_MONTH)
        val initialHour = calendar.get(Calendar.HOUR_OF_DAY)
        val initialMinute = calendar.get(Calendar.MINUTE)

        val datePickerDialog = DatePickerDialog(this, { _, year, month, day ->
            val timePickerDialog = TimePickerDialog(this, { _, hourOfDay, minute ->
                setReminder(year, month, day, hourOfDay, minute)
            }, initialHour, initialMinute, true)
            timePickerDialog.show()
        }, initialYear, initialMonth, initialDay)

        datePickerDialog.show()
    }

    private fun setReminder(year: Int, month: Int, day: Int, hourOfDay: Int, minute: Int) {
        val calendar = Calendar.getInstance()
        calendar.set(year, month, day, hourOfDay, minute)

        
        if (calendar.timeInMillis > System.currentTimeMillis()) {
            val alarmManager = getSystemService(Context.ALARM_SERVICE) as AlarmManager
            val intent = Intent(this, ReminderReceiver::class.java)
            intent.putExtra("REMINDER_TEXT", etReminderText.text.toString())
            intent.putExtra("REMINDER_TIME", calendar.timeInMillis)

            
            val pendingIntent = PendingIntent.getService(
                this, 0, intent,
                PendingIntent.FLAG_IMMUTABLE
            )

            
            alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.timeInMillis, pendingIntent)
            Toast.makeText(this, "Alert sets at: ${calendar.time}", Toast.LENGTH_SHORT).show()
        } else {
            Toast.makeText(this, "Enter date and time from future", Toast.LENGTH_SHORT).show()
        }
    }
}

提醒服务.kt

package com.example.kalendarz_2

import android.app.*
import android.content.Intent
import android.os.Build
import android.os.IBinder
import android.util.Log
import androidx.annotation.RequiresApi
import java.util.*

class ReminderService : Service() {

    override fun onBind(intent: Intent?): IBinder? {
        return null
    }

    @RequiresApi(Build.VERSION_CODES.O)
    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        Log.d("ReminderService", "Reminder service started")
        showReminderNotification(intent?.getStringExtra("REMINDER_TEXT") ?: "no reminder content")

        
        return START_STICKY
    }

    @RequiresApi(Build.VERSION_CODES.O)
    private fun showReminderNotification(reminderText: String) {
        
        val notificationManager =
            getSystemService(NotificationManager::class.java)

        
        val notificationChannelId = "channel_id"
        val notificationBuilder = Notification.Builder(this, notificationChannelId)
            .setContentTitle("Notification")
                .setContentText("Content notification: $reminderText")
            .setSmallIcon(R.mipmap.ic_launcher)
            .setAutoCancel(true)

        
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
            val notificationChannelId = "channel_id"
            val notificationChannel = NotificationChannel(
                notificationChannelId,
                "Notifications",
                NotificationManager.IMPORTANCE_HIGH
            )
            notificationManager?.createNotificationChannel(notificationChannel)
            notificationBuilder.setChannelId(notificationChannelId)
        }

        
        notificationManager?.notify(1, notificationBuilder.build())
    }
}

ReminderReceiver.kt

package com.example.kalendarz_2

import android.app.AlertDialog
import android.content.BroadcastReceiver
import android.content.Context
import android.content.DialogInterface
import android.content.Intent
import android.os.Build
import android.util.Log
import android.widget.Toast

class ReminderReceiver : BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent?) {
        Log.d("ReminderReceiver", "Received reminder broadcast")
        val reminderText = intent?.getStringExtra("REMINDER_TEXT") ?: "no reminder content"
        val reminderTime = intent?.getLongExtra("REMINDER_TIME", 0) ?: 0

        
        val currentTime = System.currentTimeMillis()

        if (reminderTime > currentTime) {
            
            val serviceIntent = Intent(context, ReminderService::class.java)
            serviceIntent.putExtra("REMINDER_TEXT", reminderText)
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                context?.startForegroundService(serviceIntent)
            } else {
                context?.startService(serviceIntent)
            }
        } else {
            Toast.makeText(context, "Notification: $reminderText", Toast.LENGTH_LONG).show()
        }
    }
}

activity_main.xml

<!-- res/layout/activity_main.xml -->
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingLeft="16dp"
    android:paddingTop="16dp"
    android:paddingRight="16dp"
    android:paddingBottom="16dp"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/btnSetReminder"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Ustaw Przypomnienie"
        android:layout_centerInParent="true"
        android:onClick="showDateTimePicker" />

    <EditText
        android:id="@+id/etReminderText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/btnSetReminder"
        android:layout_marginTop="16dp"
        android:hint="Treść przypomnienia"
        android:padding="16dp"
    />
</RelativeLayout>

我记得 AndroidManifest.xml 文件中的相应行:

<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />

我在各个网站上找资料,也查阅了gpt chat

android kotlin android-studio notifications broadcast
1个回答
0
投票
val intent = Intent(this, ReminderReceiver::class.java)

这个

Intent
指向
BroadcastReceiver
的子类。

val pendingIntent = PendingIntent.getService(
                this, 0, intent,
                PendingIntent.FLAG_IMMUTABLE
            )

此代码需要一个

Intent
指向
Service
的子类,就像您调用
getService()
一样。

因此,要么您需要使用指向

Intent
Service
,要么需要使用
getBroadcast()
。方法调用和
Intent
需要匹配。

在这种情况下,不清楚服务中的值是什么,所以我会切换到

getBroadcast()
并让
ReminderReceiver
显示您的
Notification

© www.soinside.com 2019 - 2024. All rights reserved.