Android AlarmManager难以理解的行为

时间:2012-06-12 17:37:48

标签: android android-service alarmmanager android-pendingintent

我知道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 下午01:00 02:00 PM 下午18:00

设置此操作后,执行

   adb shell dumpsys alarm

我可以看到所有待处理的意图。然后我去睡觉.....当我早上07:30起床时,安排在凌晨01:00的行动尚未执行,如果我执行

    adb shell dumpsys alarm

我所有待处理的意图都消失了!!!!!!!

我对此行为感到非常沮丧,因为我花了很多时间编写这个应用程序,但我无法使其正常工作。经过数周的研究,我发布了这个问题,因为我尝试了所有的东西,但我仍然有这个问题。请帮帮我

1 个答案:

答案 0 :(得分:2)

来自AlarmManagerlink here)的文档:

  

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

如果您的Service也没有设置正确的唤醒锁定,那么当AlarmManager完成后,设备将重新进入休眠状态,您需要在代码中对此进行管理。< / p>

HTH