5

私のアプリでは、アラーム タイマーを使用して、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 以降で問題が発生することがわかりました。タスクキラーを実行せず、ルート化されていないシステム。

メインアプリのタイマーが更新を停止したかどうかを確認するためだけに受信機を実行する「ウォッチドッグ」アラームタイマーも作成しました。私が見つけたのは、そのタイマーもキャンセルされていることです(それ以上「最後に実行された」更新は行われず、メインアプリが停止したことに気づきませんでした)。

この問題は私にとってアプリキラーです。いつ、何が起こっているのかを試してデバッグする方法さえ提案できますか? システムまたは他の何かによってタイマーがキャンセルされたときに、システムによって作成されたログエントリはありますか? 跡形もなく蒸発してしまうのが嫌です。

4

1 に答える 1

1

これが完全な答えだとは言えませんが、これら 2 つの変更により、キャンセルされたアラームの多くが停止したようです。

1)何らかの理由でアラームをキャンセルしなければならなかったときに、アラームマネージャーで cancel() を呼び出すのではなく、保留中のインテントを取得してそれをキャンセルしていました。時間の経過とともに、それがアラーム マネージャーを混乱させたかどうかはわかりませんが、おそらく良くはありませんでした。ここで、アラーム マネージャーと保留中のインテントをキャンセルします。

2) ユーザーの 1 人が、RAM のクリアを実行するとサービスが無効になると述べました。どうやら一部の携帯電話には、メモリ/ RAMをクリアできる素敵な光沢のあるボタンを提供するタスクマネージャーが付属しているようです. ボタンは、それを押すと一部のアプリが動作しなくなることを明確に示しています...それでもユーザーはそれをマッシュアップします. 正確な方法はわかりませんが、ほとんどの場合、これによりアラームが停止するようです。だから私は人々にそれをやめるように大きな通知を出しました. それ以来、物事は本当に静かになりました. 残念な点は、ユーザーが死の魔法のボタンを押した場合、または何かが本当にうまくいかなかった場合に、次に無効になったアラームが表示されたときに、本当にわからないことです。

しかし、どちらにしても、今は良くなっています。

于 2012-05-15T13:53:24.357 に答える