私のアプリでは、アラーム タイマーを使用して、2 分ごとにサーバーの更新をチェックしています。これを使用して繰り返しタイマーを作成します。
alarmIntent = new Intent(context, OnWakeUpReceiver.class);
PendingIntent pIntent = PendingIntent.getBroadcast(context, 0, alarmIntent, 0);
mAlarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 120000, pIntent);
大多数の人にとって、これは問題なく機能します。しかし、アプリが突然更新を停止したと報告する人が少数います。タイマーが存在するかどうかを確認する簡単なチェックを入れました。
PendingIntent pIntent = PendingIntent.getBroadcast(context, 0, alarmIntent, PendingIntent.FLAG_NO_CREATE);
確かに、アプリが更新されなくなった場合、これは null を返し、タイマーがまだ存在しないことを示します。
私のアプリはアラーム タイマーを制御していました (ネットワークに接続していないときにオフにし、ネットワークに接続しているときにオンに戻すなど)。たぶん、どういうわけかオフにして、オンに戻さなかったと思いました。そこで、アラームタイマーをキャンセルするためにすべての呼び出しを削除したバージョンを作成しました。そのため、私のアプリにはそのタイマーをキャンセルする手段がなくなりました。しかし、ほんの数日後、再びアラーム タイマーが表示されなくなり、アプリが更新されません。
私自身のシステムでこれを実現することはできませんでした。おそらく Android システムがそれをキャンセルしたのではないかと思いましたが (それによって私のアプリは再び動作しなくなります)、問題のあるシステムの 1 つでは、彼は電話でほとんど何も実行していないと言いました。
タスク キラーがアラーム タイマーも殺すかどうかはわかりませんでしたが、SDK 8 を考えると、タスク キラーはそれを行うことができなくなり、バージョン 8 以降で問題が発生することがわかりました。タスクキラーを実行せず、ルート化されていないシステム。
メインアプリのタイマーが更新を停止したかどうかを確認するためだけに受信機を実行する「ウォッチドッグ」アラームタイマーも作成しました。私が見つけたのは、そのタイマーもキャンセルされていることです(それ以上「最後に実行された」更新は行われず、メインアプリが停止したことに気づきませんでした)。
この問題は私にとってアプリキラーです。いつ、何が起こっているのかを試してデバッグする方法さえ提案できますか? システムまたは他の何かによってタイマーがキャンセルされたときに、システムによって作成されたログエントリはありますか? 跡形もなく蒸発してしまうのが嫌です。