【问题标题】:Android AlarmManager incomprehensible behaviorAndroid AlarmManager 无法理解的行为
【发布时间】:2012-06-12 17:37:48
【问题描述】:

我知道 AlarmManager 被讨论过多次,但我真的找不到可以帮助我的答案。我有一个应用程序需要在某个时间启动服务并制作一些东西,所以经过一些研究工作,我决定 AlarmManager 是我需要的。

我使用这段代码来完成这项工作

    Intent myIntent=new Intent();
    ComponentName cn=new ComponentName("my.package.name", "my.package.name.AlarmService");
    myIntent.setComponent(cn);
    PendingIntent pendingIntent= PendingIntent.getService(alarm._context, alarm.id, myIntent, 0);
    AlarmManager alarmManager = (AlarmManager) _context.getSystemService(Context.ALARM_SERVICE);
    alarmManager.set(AlarmManager.RTC_WAKEUP, alarm.time, pendingIntent);

“警报”是我写的一个对象。 现在,我确信这段代码可以工作,因为如果我将一个(或多个)动作设置为 2 分钟或几个小时,它就可以工作(我在服务的第一条指令中写了一个日志文件)。如果我执行

    adb shell dumpsys alarm

我可以看到我所有的未决意图。好的,很高兴看到一切正常,我将我的操作安排在:

上午 01:00 上午 08:00 上午 08:40 09:15:AM 下午 1:00 下午 02:00 晚上 18:00

设置此操作后,我执行

   adb shell dumpsys alarm

我可以看到所有未决的意图。然后我去睡觉......当我早上 07:30 醒来时,安排在 01:00 AM 的动作还没有执行,如果我执行了

    adb shell dumpsys alarm

我所有未决的意图都消失了!!!!!!!

我对这种行为感到非常沮丧,因为我花了很多时间编写这个应用程序,但我无法让它正常工作。经过数周的研究,我发布了这个问题,因为我尝试了每一件事,但我仍然遇到这个问题。请帮帮我

【问题讨论】:

  • 你在什么设备/ROM上?您是否尝试过在其他设备上运行该应用程序?我在一台设备上遇到了完全相同的问题(Cyanogenmod 10.1.3,即 Android 4.2.2)。但是,该问题似乎不会出现在其他设备上(HTC Stock,Android 4.1)。你找到解决办法了吗?

标签: android android-service alarmmanager android-pendingintent


【解决方案1】:

来自AlarmManager (link here) 的文档:

只要闹钟响起,闹钟管理器就会持有 CPU 唤醒锁 接收者的 onReceive() 方法正在执行。 这保证了 在您完成广播处理之前,手机不会休眠。 一旦 onReceive() 返回,警报管理器就会释放这个唤醒锁。 这意味着在某些情况下,手机会在您使用 onReceive() 方法完成。 如果您的警报接收器调用 Context.startService(),有可能手机会休眠 在请求的服务启动之前。 为防止这种情况,您的 BroadcastReceiver 和 Service 将需要实现单独的唤醒 锁定策略,以确保手机继续运行,直到 服务可用。

如果您的Service 没有设置正确的唤醒锁,当AlarmManager 完成时设备将立即进入睡眠状态,您也需要在代码中进行管理。

HTH

【讨论】:

  • 您好 Devunwired,首先非常感谢您的回答。你能给我一个链接到一个很好的例子吗?我不是一个那么专业的 android 开发人员,有很多关于这让我感到困惑的事情。在此先感谢您的帮助
  • 我将从 PowerManager 文档开始,因为这是您的应用程序代码在“睡眠”期间执行时需要获取 WakeLock 的方式:developer.android.com/reference/android/os/PowerManager.html
  • 再次感谢,但我一进入页面就看到粗体字:使用此 API 会显着影响设备电池寿命这是否意味着我的应用程序会耗尽用户的电池吗?这是我能做到的唯一方法吗?难道没有更好的方法来在特定时间执行一些代码(不需要用户交互)而不会耗尽电池吗?
  • 这种说法很不合逻辑;您不能将设备从睡眠中唤醒来做一些工作,并期望电池不会被用来做这些工作。这些声明存在的原因是让您意识到您应该明智地使用这些 API,并且不要让设备保持清醒的时间超过您工作所需的时间。无限期地持有 WakeLock 会像一直打开 GPS 一样耗尽电池电量。
  • 好吧,你说得对,这是一个愚蠢的说法,但在这一点上,有一点我不明白:如果我将我的待定意图设置在 2 分钟前并让手机进入睡眠状态(使用开/关按钮),并且在应该执行该操作后再次打开手机,我看到该操作已执行。但是,当我按照主要问题中的说明设置操作时,第二天早上我所有未决的意图都不存在了。我错过了什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-08
  • 1970-01-01
  • 1970-01-01
  • 2012-11-07
  • 2020-01-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多