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

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

所以在上面的代码中,它经历了一个“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/

相关文章:

android - com.android.support :support-v4 has different version for the compile

android - 为什么当应用程序被杀死时 AlarmManager 广播会被取消?

android - AlarmManager 是否要求 PendingIntent 是 BroadcastReceiver 类型?

Android beta 测试服务

android - 应用的主题在 Oreo 8.1 设备上崩溃

android - IntentService 连接到服务器监听

java - 使用 IntentService 使用 Camera2 拍照

android - Android Service 可以比 Application 对象长寿吗?

android - 即使在任务管理器终止进程后,也要保持 android 警报

Android 控制 ViewPager 滚动条