AlarmManager仅在很短的时间内工作

时间:2016-07-17 15:54:45

标签: android android-studio alarmmanager

我使用了一个AlarmManager:

 final Intent myIntent = new Intent(this.context, AlarmReceiver.class);
 alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
 final Calendar calendar = Calendar.getInstance();
 add.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
 calendar.set(Calendar.HOUR_OF_DAY, tp1.getCurrentHour());
            calendar.set(Calendar.MINUTE, tp1.getCurrentMinute());


            myIntent.putExtra("extra", "yes");
           myIntent.putExtra("quote id", String.valueOf(quote));
            pending_intent = PendingIntent.getBroadcast(Addevent.this, 0, myIntent, PendingIntent.FLAG_UPDATE_CURRENT);

            alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pending_intent); 
}
});

如果将时间设置为接近几小时,但是如果跨度大于9小时,则可以正常工作,当警报创建时,会立即调用AlarmReceiver的onReceive()方法。我哪里出错了?

2 个答案:

答案 0 :(得分:1)

您必须使用与您在调用set时使用的标志相对应的时间。两个ELAPSED_REALTIME_...标志对应于自引导以来的时间(elapsedRealTime)。两个RTC_...标志对应于自纪元(currentTimeMillis)以来的时间。

如果您要安排重复均匀,请注意AlarmManager过去不会安排任务。由于调度需要与不同的进程进行通信,因此有时可能需要超过一毫秒的时间来进行调度。如果您计划在将来少于几毫秒的第一次出现,它可能会消失。

已编辑添加:

最后,不清楚您的代码应该如何工作(tp1中的内容),但您使用的是Calendar方法set,而不是addset只是设置指定字段的值。它没有“携带”到下一个领域。

答案 1 :(得分:0)

请找到我用来安排闹钟管理器在第二天触发事件的代码段。

 public void scheduleAlarm(..) {

            // time at which alarm will be scheduled here alarm is scheduled at 1 day from current time, 
            // we fetch  the current time in milliseconds and added 1 day time
            // i.e. 24*60*60*1000= 86,400,000   milliseconds in a day       
            Long time = new GregorianCalendar().getTimeInMillis()+24*60*60*1000;

            // create an Intent and set the class which will execute when Alarm triggers, here we have
            // given AlarmReciever in the Intent, the onRecieve() method of this class will execute when
            // alarm triggers.
            Intent intentAlarm = new Intent(this, AlarmReciever.class);

            // create the object
            AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

            //set the alarm for particular time
            alarmManager.set(AlarmManager.RTC_WAKEUP,time, PendingIntent.getBroadcast(this,1,  intentAlarm, PendingIntent.FLAG_UPDATE_CURRENT));

            Toast.makeText(this, "Alarm Scheduled for Tommrrow", Toast.LENGTH_LONG).show();

    }

希望这会有所帮助......