Android 开发 AlarmManager的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 开发 AlarmManager的问题相关的知识,希望对你有一定的参考价值。

程序如下,我想每隔10秒发送一次广播。但是发现setRepeating不管设置间隔时间是多少,它都是间隔5分钟才发送一次。这是怎么回事?

Intent intent = new Intent("PPPPP");
PendingIntent sender = PendingIntent.getBroadcast(this, 0,
intent, 0);
AlarmManager am = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
// 10秒一个周期
am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 10*1000, sender);

am.setRepeating(AlarmManager.RTC_WAKEUP,SystemClock.elapsedRealtime(), 10 * 1000, sender);你改成这样试试。另外检查下别的地方对这个闹钟有没有影响。 参考技术A 你用的api什么级别?三个参数setRepeating,四个参数setInexactRepeating
不精确的可能会有这个问题吧。
setRepeating(int type, long triggerAtMillis, long intervalMillis, PendingIntent operation)
setInexactRepeating(int type, long triggerAtMillis, long intervalMillis, PendingIntent operation)
参考技术B 你看看是不是自己外面的线程设置了间隔时间问题追问

这个没有。

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定时器设置

android 闹钟设置问题

android app被杀死 alarmmanager能不能唤醒

在android中开发预定的应用程序