android alarmmanager如果设置过去的时间就会触发广播?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android alarmmanager如果设置过去的时间就会触发广播?相关的知识,希望对你有一定的参考价值。

在学习一个android闹钟程序,发现alarmmanager如果设置过去的时间就会触发广播。(看来一下文档找到这么一句话:If the time occurs in the past, the alarm will be triggered immediately. )请问如何才能实现能设置过去的时间?(或者设置明天的时间)
按照这个例子做的:http://blog.csdn.net/wdaming1986/article/details/6705902

虽然问题已经关闭,但忍不住回复你。明天的时间,怎么会是过去的时间?明明就是未来的时间。你以为今天16点大于明天早上8点?如果是,你就不了解Java的时间标识方法。Java为了存储方便,用long型数据表示1970.1.1凌晨0点0分0秒0毫秒到现在时间。
例如
1346829956843
表示:2012年09月05日 15时25分56秒843毫秒
1346891156843
表示:2012年09月06日 08时25分56秒843毫秒
所以明天的时间绝对是比今天大的。
AlarmManager.set(int type, long triggerAtTime, PendingIntent operation)函数里,triggerAtTime就是上述的long型。
参考技术A android系统就是这样的,你可以在Calendar设置时间时做个判断,如果是过去的时间,就把Calendar的日期加一,这样就是第二天的闹钟了。 参考技术B 增加判断:
if(当前时间16点>你想设置的时间8点)

把当前日期加1.
参考技术C 改日期试试,我遇到一个这样的问题。就是立刻触发了,但系统闹钟不会,在找办法解决 参考技术D 作个判断就行啦,如果设置时间已经过去了,就不让他发送这个广播

Android AlarmManager定时器设置

        Android开发中一般常见的定时器有 Timer、Handler。某些场景下也会使用到 AlarmManager ,相对于前面两者,AlarmManager 功能更加多样,某些场景下有更准确的定时效果。

// Timer
        Timer timer = new Timer();
        TimerTask task = new TimerTask() 
            @Override
            public void run() 
                // ... ...
            
        ;
        // 延迟 1s 执行
        timer.schedule(task, 1000);
        // 取消执行
        timer.cancel();


// Handler
        Handler handler = new Handler(getMainLooper());
        handler.postDelayed(new Runnable() 
            @Override
            public void run() 
                // ... ...
            
        , 1000);

AlarmManager 中相关方法有以下几种:(根据官网说明)

setInexactRepeating                 

        触发时间要求不准确的重复警报;例如,每小时重复一次的警报,但不一定在每小时的开头。这些警报比 传统上提供的严格重复警报更节能setRepeating(int, long, long, PendingIntent),因为系统可以调整警报的传递时间,以使它们同时触发,避免不必要地从睡眠中唤醒设备。

setRepeating

        设置重复警报。注意:对于计时操作(滴答声、超时等),需要使用 Handler。如果已经为同一个 IntentSender 安排过警报,它将取消先前的。像set(int, long, PendingIntent),可以提供自动重复的警报,直到使用 明确删除cancel(AlarmManager.OnAlarmListener)。如果规定的触发时间是过去的,则将立即触发警报,警报计数取决于触发时间相对于重复间隔过去多长时间。
       如果警报被延迟(由于系统睡眠,例如,对于非 _WAKEUP 警报类型),将尽快发送跳过的重复。之后,未来的告警将按照原定的时间表进行传递;它们不会随时间漂移。例如,如果您设置了每隔一小时的重复闹钟,但手机在 7 点 45 分到 8 点 45 分处于睡眠状态,则手机一醒来就会发出闹钟,然后下一个闹钟会在9:00。
       如果您的应用程序希望允许传递时间漂移以保证警报之间始终至少经过一定的时间间隔,那么采取的方法是使用一次性警报,在处理每个警报传递时自己安排下一个。

set

        对于计时操作(滴答声、超时等),使用Handler。如果已经为同一个 IntentSender 安排了警报,则将首先取消之前的警报。如果规定的触发时间已经过去,则立即触发警报。如果这个 Intent 调度已经有一个警报(两个 Intent 的相等性由 定义 Intent#filterEquals),那么它将被删除并替换为这个。从 API 19 开始,传递给此方法的触发时间被视为不精确

setExact

        在规定时间准确的发送警报。从 开始Build.VERSION_CODES#S,面向 SDK 级别 31 或更高级别的应用需要请求 SCHEDULE_EXACT_ALARM使用此 API 的权限,除非该应用不受电池限制。用户和系统可以通过设置中的特殊应用访问屏幕撤销此权限。

setAndAllowWhileIdle

        类似set(int, long, android.app.PendingIntent),但即使系统处于低功耗空闲(又名打盹)模式,也允许执行此警报。这种类型的警报只能用于实际需要在空闲时发出警报的情况:例如,日历通知应该发出声音以便用户知道它。发出警报后,该应用程序还将添加到系统的临时电源豁免列表中大约 10 秒,以允许该应用程序获取更多唤醒锁以完成其工作。

        这些警报会在空闲时显着影响设备的电源使用(从而导致调度它们的应用程序严重指责电池),因此应谨慎使用它们。为了减少滥用,对特定应用程序的警报响起频率有限制。在正常的系统操作下,它不会超过大约每分钟发送这些警报(此时每个此类挂起的警报都会被发送);在低功耗空闲模式下,此持续时间可能会更长,例如 15 分钟。

setExactAndAllowWhileIdle

        类似 setAndAllowWhileIdle ,区别在于此方法定时警报更加准确。

     需要精确的延时控制需要使用 setExact 或者 setExactAndAllowWhileIdle ,需要休眠仍然准确就只能使用 setExactAndAllowWhileIdle

以上是关于android alarmmanager如果设置过去的时间就会触发广播?的主要内容,如果未能解决你的问题,请参考以下文章

Android AlarmManager定时器设置

Android AlarmManager定时器设置

Android AlarmManager定时器设置

使用 AlarmManager 设置重复通知 - Android

Android 中使用AlarmManager设置闹钟详解

android AlarmManager使用详解