通过calendar.getTimeInMillis()设置时,AlarmManager不会熄灭

时间:2017-01-02 18:14:53

标签: android android-service alarmmanager

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);
}

所以在上面的代码中,它通过&#34; for i&#34;循环,它为每节课的开始创建一个AlarmManager。当AlarmManager启动时,它会打开一个名为&#34; StartNotification&#34;而不是像这样发出通知......

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 - &gt; 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" />        
    ...

1 个答案:

答案 0 :(得分:1)

首先,您需要更改创建PendingIntent的行。问题是您正在创建具有一些待定意图的第一个警报,并且在第二个循环(您要为第二个课程创建警报的位置)创建您正在使用相同的待处理意图等等。

  

当对两个不同的警报使用相同的待处理意图时,只会设置最后一个,然后触发,并从系统中删除前一个。

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

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

您还需要考虑重置这些警报的频率。如果您认为可以在最近的将来再次设置相同课程的警报,那么请考虑使用待定意图的flags。原因是更新现有的待处理意图或使用旧的意图但重置时间等。因此,也要考虑这一点。

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

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