0

我知道 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 AM 08:00 AM 08:40 AM 09:15:AM 01:00 PM 02:00 PM 18:00 PM

设置此操作后,我执行

   adb shell dumpsys alarm

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

    adb shell dumpsys alarm

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

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

4

1 回答 1

2

AlarmManager来自(链接在这里)的文档:

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

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

高温高压

于 2012-06-12T17:42:43.207 回答