重新启动后,Alarmmanager在第二天不工作

时间:2018-09-30 14:50:00

标签: java android notifications alarmmanager alarm

这就是我创建闹钟的方式

    PendingIntent alarmIntent = PendingIntent.getBroadcast(getContext(), 1, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    AlarmManager alarm = (AlarmManager) getContext().getSystemService(ALARM_SERVICE);

    Calendar startTime = Calendar.getInstance();

    startTime.set(Calendar.HOUR_OF_DAY, hourOfDay);
    startTime.set(Calendar.MINUTE, minute);
    startTime.set(Calendar.SECOND, 0);

    if (startTime.getTimeInMillis() < System.currentTimeMillis()) {
        startTime.add(Calendar.DAY_OF_MONTH, 1);
    }

    long intendedTime = startTime.getTimeInMillis();

    alarm.setRepeating(AlarmManager.RTC_WAKEUP, intendedTime, AlarmManager.INTERVAL_DAY, alarmIntent);

我在BroadcastReceiver中调用的方法:

private void startAlarm(Context context) {
    Intent mainIntent = new Intent(context, MainActivity.class);
    PendingIntent contentIntent = PendingIntent.getActivity(context, 1, mainIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    NotificationManager myNotificationManager =
            (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
    Notification.Builder builder = new Notification.Builder(context);
    builder.setSmallIcon(R.drawable.l_active)
            .setContentTitle(context.getString(R.string.morn_title))
            .setContentText(context.getString(R.string.morn_text))
            .setWhen(System.currentTimeMillis())
            .setContentIntent(contentIntent);
    myNotificationManager.notify(1, builder.build());
}

所以我遇到了类似here的问题。当我将闹钟设置为9:51并且我的时间是10:00时-闹钟无法正常工作。添加后

if (startTime.getTimeInMillis() < System.currentTimeMillis()) {
        startTime.add(Calendar.DAY_OF_MONTH, 1);
}

警报工作正常,但是当我重新启动电话时-它不起作用。我将尝试用一个例子来解释: 我手机上的时间是23:50。我在00:05设置了闹钟,然后重新启动了手机,并等到00:05。而且警报不会触发。但!如果我不重启手机-一切正常。还有一件事:当我不设置时间时(例如,我的时间是22:00,我将时间设置为22:05,重新启动电话,它可以正常工作),电话重新启动没有问题

1 个答案:

答案 0 :(得分:2)

即使重新启动后,AlarmManager也不会持续存在。 重新启动后,您可以通过创建BroadCastReceiver使AlarmManager正常工作,该设备将在设备启动完成时启动警报。

使用<action android:name="android.intent.action.BOOT_COMPLETED" />捕获BroadCastReceiver类中的引导活动。

您需要在AndroidManifest.xml中添加以下行,

<receiver android:name=".StartUpReceiver" android:enabled="true" android:exported="false" android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
  <intent-filter>
    <action android:name="android.intent.action.BOOT_COMPLETED" />
  </intent-filter>
</receiver>

StartUpReceiver类

public class StartUpReceiver extends BroadcastReceiver {
  @Override
  public void onReceive(Context context, Intent intent) {

      if ("android.intent.action.BOOT_COMPLETED".equals(intent.getAction())) {
         ////// reset your alrarms here 
      }

  }
}  

StartUpReceiver中,您可以通过AlarmManager再次创建警报。我建议您需要在store alarm infodatabase中使用SharedPreferences,以便在设备完成重新启动时具有创建警报的信息。