引导Android设备时重复通知

Repeat notification when Android device is booted

在Android中,我使用AlarmManager设置每天执行一次的重复任务。用户可以选择该警报的时间。例如,当他选择9:00时,每天都会在9时执行给定的任务,即启动一个待处理的意图,该意图将通知发送到通知栏。

我的应用程序的用户说,当时他们的设备关闭时,根本没有任何通知。是真的,当警报响起时设备关闭时,再次启动后不会重复发出警报吗?

如果这是正常行为,该如何规避?我应该在触发通知的IntentService中写一个共享的首选项(例如" last_execution_time ")吗?在启动时,我可以检查上一次执行是否已经超过24小时,如果是,请重复执行吗?


为动作android.intent.action.BOOT_COMPLETED注册意图的广播接收器,它将开始执行与您通过AlarmManager安排的任务相同的任务(以前确保它没有在适当的时候被AlarmManager触发)。

编辑:
跟踪这样的东西(只是一个小技巧-自己安全地处理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....
    }
}