通过 calendar.getTimeInMillis() 设置时,AlarmManager 不会关闭
AlarmManager doesn't go off when set through calendar.getTimeInMillis()
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);
(from calendar.getTimeInMillis
--> System.currentTimeMillis() + 1000
) 它工作正常,但只针对第一个警报。尽管您认为所有(在本例中为 5 个)alarms/notifications 会同时熄灭(在 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
的行。问题是您正在创建带有一些未决意图的第一个警报,而在第二个循环(您要为第二课创建警报的地方)您正在使用相同的未决意图等等。
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 节课的每一节课都需要不同的待处理意图。在您的情况下,您需要使用不同的 requestCode
,因为您的 intents
相同(PendingIntent 不比较额外内容)。简单的解决方案可能是传递 for
循环的整数 i
。
PendingIntent pendingNotifications = PendingIntent.getService(this, i, notifications, 0);
您还需要考虑重置这些警报的频率。如果您认为在不久的将来可能会再次设置相同课程的闹钟,请考虑使用 flags
待定意图。原因是更新现有的待定意图或使用旧的但重置时间等。所以,也考虑一下。
日历对象的代码似乎没问题。只需确保(使用日志)您通过从字符串中获取设置的分钟和小时是正确的。也许您也可以尝试使用下面的代码来获取您所在地区的特定时间。
Calendar calendar = Calendar.getInstance(TimeZone.getDefault());
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);
(from calendar.getTimeInMillis
--> System.currentTimeMillis() + 1000
) 它工作正常,但只针对第一个警报。尽管您认为所有(在本例中为 5 个)alarms/notifications 会同时熄灭(在 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
的行。问题是您正在创建带有一些未决意图的第一个警报,而在第二个循环(您要为第二课创建警报的地方)您正在使用相同的未决意图等等。
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 节课的每一节课都需要不同的待处理意图。在您的情况下,您需要使用不同的 requestCode
,因为您的 intents
相同(PendingIntent 不比较额外内容)。简单的解决方案可能是传递 for
循环的整数 i
。
PendingIntent pendingNotifications = PendingIntent.getService(this, i, notifications, 0);
您还需要考虑重置这些警报的频率。如果您认为在不久的将来可能会再次设置相同课程的闹钟,请考虑使用 flags
待定意图。原因是更新现有的待定意图或使用旧的但重置时间等。所以,也考虑一下。
日历对象的代码似乎没问题。只需确保(使用日志)您通过从字符串中获取设置的分钟和小时是正确的。也许您也可以尝试使用下面的代码来获取您所在地区的特定时间。
Calendar calendar = Calendar.getInstance(TimeZone.getDefault());