Repeat notification when Android device is booted
在Android中,我使用AlarmManager设置每天执行一次的重复任务。用户可以选择该警报的时间。例如,当他选择9:00时,每天都会在9时执行给定的任务,即启动一个待处理的意图,该意图将通知发送到通知栏。
我的应用程序的用户说,当时他们的设备关闭时,根本没有任何通知。是真的,当警报响起时设备关闭时,再次启动后不会重复发出警报吗?
如果这是正常行为,该如何规避?我应该在触发通知的IntentService中写一个共享的首选项(例如" last_execution_time ")吗?在启动时,我可以检查上一次执行是否已经超过24小时,如果是,请重复执行吗?
为动作
编辑:
跟踪这样的东西(只是一个小技巧-自己安全地处理9点左右的准确时间;)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | public class KeepTrackReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { SharedPreferences p = context.getSharedPreferences( TrackedAlarmService.FILE_ALARM_TRACK, Context.MODE_PRIVATE); long lastAlarm = p.getLong(TrackedAlarmService.KEY_LAST_ALARM_MILLIS, -1L); if(lastAlarm == -1L || lastAlarm < TrackedAlarmService.getClosest9AM(false)) { context.startService(TrackedAlarmService.createIntent(context)); } } } public class TrackedAlarmService extends IntentService { public static final String FILE_ALARM_TRACK ="alarmTrack"; public static final String KEY_LAST_ALARM_MILLIS ="lastAlarmMillis"; public static void schedule(Context context) { AlarmManager am = (AlarmManager) context.getSystemService( Context.ALARM_SERVICE); PendingIntent pi = PendingIntent.getService(context, 0, createIntent(context), PendingIntent.FLAG_CANCEL_CURRENT); am.setRepeating(AlarmManager.RTC_WAKEUP, getClosest9AM(true), AlarmManager.INTERVAL_DAY, pi); } public static long getClosest9AM(boolean futurePastFlag) { Calendar c = Calendar.getInstance(); c.setTimeInMillis(System.currentTimeMillis()); if(futurePastFlag) { if(c.get(Calendar.HOUR_OF_DAY) > 9) { c.roll(Calendar.DATE, true); } } else { if(c.get(Calendar.HOUR_OF_DAY) < 9) { c.roll(Calendar.DATE, false); } } c.set(Calendar.HOUR_OF_DAY, 9); c.set(Calendar.MINUTE, 0); return c.getTimeInMillis(); } public static Intent createIntent(Context context) { return new Intent(context, TrackedAlarmService.class); } public TrackedAlarmService() { super("TrackedAlarmService"); } @Override protected void onHandleIntent(Intent intent) { //save last alarm time getSharedPreferences(FILE_ALARM_TRACK, MODE_PRIVATE) .edit() .putLong(KEY_LAST_ALARM_MILLIS, System.currentTimeMillis()) .commit(); // Do your repeating job.... } } |