AlarmManager没有停止先前的PendingIntent

时间:2013-08-12 05:14:54

标签: android alarmmanager android-pendingintent

我有一个功能,我设置 15分钟重复闹钟以启动我的服务,该服务调用web服务,处理结果并关闭。简化为:

public static void setAlarm(Context cx) {
    try{
        //My service is running, no need to reset the alarm
        if (isServiceRunning())
            return;

        Intent intent = new Intent(cx, ResultService.class);
        PendingIntent sender = PendingIntent.getService(cx, 0, intent, PendingIntent.FLAG_NO_CREATE);
        //My pending intent exists, no need to reset the alarm
        if (sender!=null)
            return;

        sender = PendingIntent.getService(cx, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
        AlarmManager am = (AlarmManager) cx.getSystemService(cx.ALARM_SERVICE);
        //Cancel any previous alarms????
        am.cancel(sender);
        am.setRepeating(AlarmManager.RTC_WAKEUP, firstRun, interval, sender);
    }catch (Exception e){           
    }
}

这是由侦听以下事件的BroadcastReceiver调用的

ACTION_SCREEN_ON
ACTION_BOOT_COMPLETED
CONNECTIVITY_ACTION

通过

setAlarm(context.getApplicationContext());

似乎有效但我开始在随机设备上看到多次调用我的网络服务每秒

我试过在调试时没有成功。

我在这里做错了什么?

更新

我跑了

adb shell dumpsys alarm > dump.txt

检查警报锁定,每次警报管理器执行PendingIntent时,我都会看到唤醒/警报的数量增加:

 com.x

279ms running, 22 wakeups

22 alarms: flg=0x4 cmp=com.x/.service.ResultService

这意味着什么吗?

更新2

我跟踪了其中一个有问题的设备。

它在一天中的大部分时间都应该调用Web服务,然后在昨晚19:53突然间我在6秒内从设备上拨打了330个额外的电话。

之后它运行正常,直到今天早上06:50,当我得到282个额外的电话时,在06:55我再接到130个额外的电话。

1 个答案:

答案 0 :(得分:0)

int RQS=1;
//RQS- request id for starting the alram ,get the same request and cancel
// starting the alarm
intent = new Intent(getBaseContext(), Receiver.class);

pendingIntent = PendingIntent.getBroadcast(getBaseContext(), RQS,
        intent, PendingIntent.FLAG_CANCEL_CURRENT);
alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC_WAKEUP, targetCal.getTimeInMillis(),
            pendingIntent);
//cancelling the request
alarmManager.cancel(PendingIntent.getBroadcast(getBaseContext(), RQS, intent,
                        PendingIntent.FLAG_UPDATE_CURRENT));