【问题标题】:Repeat notification when Android device is booted启动 Android 设备时重复通知
【发布时间】:2012-07-07 07:32:46
【问题描述】:

在 Android 中,我使用 AlarmManager 设置每天执行一次的重复任务。用户可以选择此警报的时间。例如,当他选择 9:00 点时,每天 9 点执行给定的任务,即启动一个未决意图,将通知放在通知栏上。

我的应用程序的用户说,当他们的设备当时关闭时,根本没有任何通知。是不是在闹钟响起的时候设备关机了,再次开机后闹钟就不再重复了?

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

【问题讨论】:

    标签: android android-notifications android-alarms


    【解决方案1】:

    使用操作android.intent.action.BOOT_COMPLETED 为意图注册广播接收器,这将启动与您使用 AlarmManager 计划的任务相同的任务(以前确保它没有被 AlarmManager 在适当的时间触发)。

    编辑: 为了保持跟踪尝试这样(这只是一个提示 - 自己安全地处理 9 点左右的准确时间;)

    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....
        }
    }
    

    【讨论】:

    • 谢谢。我的问题实际上是 如何 确保该任务之前没有被解雇过。很明显,我在这里需要BOOT_COMPLETED 的广播接收器。
    • 只是跟踪它,我认为它更明显;)
    猜你喜欢
    • 2017-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多