0

サービスを開始するために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());

動作しているように見えますが、ランダムなデバイスで1 秒あたりに Web サービスへの複数の呼び出しが見られるようになりました。

デバッグ中にそれを実現しようとしましたが、成功しませんでした。

ここで何が間違っていますか?

アップデート

走った

adb shell dumpsys alarm > dump.txt

アラーム ロックを確認すると、アラーム マネージャーが PendingIntent を実行するたびにウェイクアップ/アラームの数が増加することがわかります。

 com.x

279ms running, 22 wakeups

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

それは何か意味がありますか?

更新 2

問題のあるデバイスの 1 つを追跡しました。

1 日のほとんどの時間、Web サービスを呼び出す必要がありますが、昨夜の 19:53 に突然、デバイスから 6 秒間で 330 の余分な呼び出しを受けます。

その後、今朝 06:50 まで問題なく動作し、282 回の追加コールが発生し、06:55 にさらに 130 回の追加コールが発生しました。

4

1 に答える 1

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));
于 2013-08-12T10:30:22.940 に答える