gpt4 book ai didi

android - 通过 calendar.getTimeInMillis() 设置时,AlarmManager 不会关闭

转载 作者:行者123 更新时间:2023-11-30 00:48:32 25 4
gpt4 key购买 nike

public int onStartCommand(Intent intent, int flags, int startId) {

...

for (int i = 1; i < dayStore.getInt("lessonCount" , 0)+1; i++) {

String lesson = dayStore.getString("Lesson" + i , "null");
String lessonWithoutTime = (lesson.substring(6, lesson.length()-6)).replace(".", "");

String lessonTitleRaw = lessonWithoutTime.split(" ")[0];
String lessonTitle = lessonTitleRaw.replace(".", "");

String startTime = lesson.substring(0, 5);

//---------------------------------------------------

Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, Integer.parseInt(startTime.substring(0,2)));
calendar.set(Calendar.MINUTE, 0);
calendar.add(Calendar.MINUTE, Integer.parseInt(startTime.substring(3,5))-5);

Intent notifications = new Intent(this, StartNotification.class);

notifications.putExtra("LessonTitle", lessonTitle);
notifications.putExtra("StartTime", startTime);

PendingIntent pendingNotifications = PendingIntent.getService(this, 0, notifications, 0);
AlarmManager startNotif = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
startNotif.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingNotifications);
}

stopSelf();

return super.onStartCommand(intent, flags, startId);
}

所以在上面的代码中,它经历了一个“for i”循环,在该循环中它为每节课的开始创建了一个 AlarmManager。当 AlarmManager 停止运行时,它会打开一个名为“StartNotification”的服务,然后发出这样的通知...

NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.main_icon)
.setContentTitle(lesson)
.setTicker(lesson + " starts in 5 minutes")
.setContentText(lesson + " from " + startTime + " to " + endTime);

mBuilder.setDefaults(Notification.DEFAULT_LIGHTS);
mBuilder.setDefaults(Notification.DEFAULT_VIBRATE);

NotificationManager mNotificationManager = (NotificationManager) this.getSystemService(this.NOTIFICATION_SERVICE);
mNotificationManager.notify(1, mBuilder.build());

stopSelf();

问题是 AlarmManager 不工作,或者可能是日历有问题。因为当我将其更改为此 startNotif.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 1000, pendingNotifications); (来自 calendar.getTimeInMillis --> System.currentTimeMillis() + 1000) 它工作正常,但仅适用于第一个警报。尽管您认为所有(在本例中为 5 个)警报/通知会同时响起(在 1000 个磨坊中),但只有第一个会响。

我知道所有警报都已设置,因为我广泛使用了 Log.D:s。日历有正确的毫秒数,我已经用很多不同的方式检查过了。

这些是我的许可:

<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.CLEAR_APP_CACHE"/>
<uses-permission android:name="com.android.alarm.permission.SET_ALARM"/>

和服务:

    <service android:enabled="true" android:name=".Notifications" />
<service android:enabled="true" android:name=".StartNotification" />
...

最佳答案

首先,您需要更改创建PendingIntent 的行。问题是您正在创建带有一些未决 Intent 的第一个警报,而在第二个循环(您要为第二课创建警报的地方)您正在使用相同的未决 Intent 等等。

When using the same pending intent for two different alarms only the last one will be set and then triggered and previous one be deleted from system.

5 节课中的每一节课都需要不同的待定 Intent 。在你的情况下,你需要使用不同的 requestCode 因为你的 intents 是相同的(PendingIntent 不比较额外的)。简单的解决方案可能是传递 for 循环的整数 i

PendingIntent pendingNotifications = PendingIntent.getService(this, i, notifications, 0);

您还需要考虑重置这些警报的频率。如果您认为在不久的将来可能会再次设置同一类(class)的警报,请考虑使用未决 Intent 的 flags。原因是更新现有的待定 Intent 或使用旧的但重置时间等。因此,也要考虑这一点。

日历对象的代码似乎没问题。只需确保(使用日志)您通过从字符串中获取设置的分钟和小时是正确的。也许您也可以尝试使用下面的代码来获取您所在地区的特定时间。

Calendar calendar = Calendar.getInstance(TimeZone.getDefault());

关于android - 通过 calendar.getTimeInMillis() 设置时,AlarmManager 不会关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41431507/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com