バックグラウンド サービスを定期的に実行するアプリケーションがあり、AlarmManager を使用してこの動作を実現しています。簡単に言うと、1 分間に 2 回 (30 秒ごとに) 実行するように設定されており、実行に約 20 秒かかります (ほとんどがスリープ状態)。
テスト用に複数の Android デバイス (4.1.2 を搭載した Galaxy SII、4.2.2 を搭載した Nexus 4 以降、CyanogenMOD 10.1.2 を搭載した Nexus 4、および 4.2.2 を搭載した Nexus 7) を使用していますが、USB とデバッガーに接続している間、それらはすべて一貫して動作します。
デバイスのプラグを抜いて机の上に置いたままにしておくと、サービスが 1 つのインターバルを逃すことがあることに気付きます。ログをよく見ると、サービスが一定期間遅れていることがあります。xx:05 と xx:35 に実行することになっている場合、xx:45 から開始することに気付くでしょう (本来より 10 秒遅れています)。
サービスが最初に行うことは、部分的な wake lock を取得して、実行中に CPU がスリープ状態にならないようにすることです。この wake lock は、本来の動作が完全に完了するまで解放されません。
私が最初に考えたのは、共有リソースの競合が動作を引き起こしている (アプリで実行されている他のプロセスがある) ことでしたが、サービスは開始されず、約 10 秒後までウェイクロックも取得されません。
この動作は、Nexus 4 で最も顕著であり、データの最大 30% が欠落していますが、Galaxy SII および Nexus 7 では大幅に少なくなります (約 2%) が、原因不明の動作であるため、依然として懸念事項です。