Android中带有通知的AlarmManager不显示任何通知

编程入门 行业动态 更新时间:2024-10-11 01:10:18
本文介绍了Android中带有通知的AlarmManager不显示任何通知的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我尝试为我的应用程序创建每日通知.为了测试应用程序,我将通知间隔设置为15分钟.不幸的是,没有显示通知.无论是在应用程序运行时还是在关闭时,都不会.我尝试通过以下解决方案来激发自己的灵感:

I try to create daily notification for my application. In order to test the application I set the interval for the notifications to 15 minutes. Unfortunately, no notification is shown. Neither when the application is running nor when it is closed. I tried to inspire myself with these solutions:

stackoverflow/questions/33055129/how-to-show-a-notification-everyday-at-a-certain-time-even-when-the-app-is-close

stackoverflow/questions/33055129/how-to-show-a-notification-everyday-at-a-certain-time-even-when-the-app-is-close

developer.android/codelabs/android-training-alarm-manager#0

developer.android/codelabs/android-training-alarm-manager#0

github/google-developer-training/android-fundamentals-apps-v2/tree/master/StandUp(上一个链接的存储库)

github/google-developer-training/android-fundamentals-apps-v2/tree/master/StandUp (repository for the previous link)

我在清单文件中添加了 uses-permissions 和 receiver .

manifest.xml

<manifest xmlns:android="schemas.android/apk/res/android" package="com.example.ovu"> <uses-permission android:name = "android.permission.VIBRATE" /> <uses-permission android:name="com.android.alarm.permission.SET_ALARM"/> <!-- Permission to start Alarm on device reboot --> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> <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/AppTheme"> <activity ... </activity> <receiver android:name= ".DailyNotificationReceiver"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"/> </intent-filter> </receiver> </application> </manifest>

此类扩展了 BroadcastReceiver 类并覆盖了 onReceive 方法.

This class extends BroadcastReceiver class and overrides onReceive method.

DailyNotificationReceiver

class DailyNotificationReceiver : BroadcastReceiver() { companion object { // Notification ID. private const val NOTIFICATION_ID = 0 // Notification channel ID. private const val PRIMARY_CHANNEL_ID = "primary_notification_channel" } private lateinit var mNotificationManager: NotificationManager private val notificationContent = "Please measure your temperature and cervical mucus" private val contentTitle = "Provide me your temperature and cervical mucus!" override fun onReceive(context: Context, intent: Intent) { mNotificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager // Deliver the notification. deliverNotification(context); } private fun deliverNotification(context: Context) { val contentIntent = Intent(context, MainActivity::class.java) val contentPendingIntent = PendingIntent.getActivity(context, NOTIFICATION_ID, contentIntent, PendingIntent.FLAG_UPDATE_CURRENT) // Build the notification val builder = NotificationCompat.Builder(context, PRIMARY_CHANNEL_ID) .setSmallIcon(R.drawable.ic_dialog_alert) .setContentTitle(contentTitle) .setContentText(notificationContent) .setContentIntent(contentPendingIntent) .setPriority(NotificationCompat.PRIORITY_HIGH) .setAutoCancel(true) .setDefaults(NotificationCompat.DEFAULT_ALL) // Deliver the notification mNotificationManager.notify(NOTIFICATION_ID, builder.build()) } }

在此活动中, AlarmManager 的实例应设置每天重复一次.

In this activity, instance of AlarmManager should set daily repeating.

活动通知

class ActivityNotification : AppCompatActivity() { companion object { // Notification ID. private const val NOTIFICATION_ID = 0 // Notification channel ID. private const val PRIMARY_CHANNEL_ID = "primary_notification_channel" } private lateinit var mNotificationManager: NotificationManager private fun notifyUser(){ val notifyIntent = Intent(this, DailyNotificationReceiver::class.java) val notifyPendingIntent = PendingIntent.getBroadcast(this, NOTIFICATION_ID, notifyIntent, PendingIntent.FLAG_UPDATE_CURRENT) val alarmManager = getSystemService(Context.ALARM_SERVICE) as AlarmManager val repeatInterval = AlarmManager.INTERVAL_FIFTEEN_MINUTES val triggerTime = (SystemClock.elapsedRealtime() + repeatInterval) alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerTime, repeatInterval, notifyPendingIntent) // Create the notification channel. createNotificationChannel(); Toast.makeText(this, "Alarm's set", Toast.LENGTH_LONG).show() } private fun createNotificationChannel() { // Create a notification manager object. mNotificationManager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager // Notification channels are only available in OREO and higher. // So, add a check on SDK version. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { // Create the NotificationChannel with all the parameters. val notificationChannel = NotificationChannel(PRIMARY_CHANNEL_ID, "Stand up notification", NotificationManager.IMPORTANCE_HIGH) notificationChannel.enableLights(true) notificationChannel.lightColor = Color.RED notificationChannel.enableVibration(true) notificationChannel.description = "Notifies every 15 minutes to " + "stand up and walk" mNotificationManager.createNotificationChannel(notificationChannel) } } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_notification) editTextNotificationHour = findViewById(R.id.editTextChangedNotification) mNotificationManager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager } fun changeNotificationHour(view: View){ notifyUser() val intent = Intent(this, ProfileActivity::class.java) startActivity(intent) finish() }

如果你们能帮助我找到解决方案,我将非常高兴.

I'd be really happy if you guys can help me to find the solution.

推荐答案

首先,让我们通过将代码更改为以下清单来启用清单中的BroadcastReceiver:

Firstly, let's start by enabling our BroadcastReceiver in Manifest by changing our code to this:

<receiver android:name= ".DailyNotificationReceiver" android:enabled="true" android:exported="true"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"/> </intent-filter> </receiver>

其次,我不太确定ActivityNotification活动的目的. 创建像Alarms这样的简单类就足够了.

Secondly, I am a bit unsure of the purpose of the ActivityNotification Activity. It would be more than enough to create a simple class like Alarms.

您可以在此处定义设置警报所需的所有方法.像这样:

From there you can define all the methods you need to set up an alarm. Something like this:

class InternetDaysLeftAlarm @Inject constructor( @ApplicationContext val context: Context ) { /** * Function is used to schedule one-time Alarm that will trigger on specific time. * * @param hourOfDay -> parameter defines what o'clock should the alarm be triggered at. (24-hour) * default value is: * @see INTERNET_DAYS_LEFT_ALARM_DEFAULT_TRIGGER_HOUR */ fun scheduleAlarm(hourOfDay: Int = INTERNET_DAYS_LEFT_ALARM_DEFAULT_TRIGGER_HOUR) { val alarmManager = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager val intent = Intent(context, InternetDaysLeftReceiver::class.java) intent.action = INTENT_ACTION_INTERNET_DAYS_LEFT_ALARM val pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0) val msUntilTriggerHour: Long = TimeUnit.MINUTES.toMillis(minutesUntilOClock(hourOfDay)) // Calculating and adding jitter in order to ease load on server val jitter: Long = TimeUnit.MINUTES.toMillis(Random.nextInt(0, 420).toLong()) val alarmTimeAtUTC: Long = System.currentTimeMillis() + msUntilTriggerHour + jitter // Enabling BootReceiver val bootReceiver = ComponentName(context, BootReceiver::class.java) context.packageManager.setComponentEnabledSetting( bootReceiver, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP ) /** * Schedules the Alarm based on Android Version. * * As per AlarmManager documentation to guarantee Alarm execution at specified time we use following methods: * * @see AlarmManager.setExactAndAllowWhileIdle -> Android.M [API 23] and above. * @see AlarmManager.setAlarmClock -> Everything below Android M. */ if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) { alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, alarmTimeAtUTC, pendingIntent) } else { alarmManager.setAlarmClock(AlarmManager.AlarmClockInfo(alarmTimeAtUTC, pendingIntent), pendingIntent) } }

通知可以通过以下方式处理:

Notifications can be handle by:

  • 创建一个单独的Notifications类

  • 处理所有通知事项,例如创建频道并在收到警报时将其发送到BroadcastReceiver内部.

更多推荐

Android中带有通知的AlarmManager不显示任何通知

本文发布于:2023-11-27 11:37:03,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1637899.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:通知   Android   AlarmManager

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!