0

この質問は基本的に私が尋ねるものと似ています。1秒ごとに実行可能ファイルを実行するサービスでタイマーを使用しようとしましたが、この実行可能ファイルは他のアクティビティのUIを更新します。

このアクティビティはバックグラウンドで実行されている場合と停止している場合がありますが、追加された質問の人が言ったように、サービスはカウントダウンを停止してはなりません。

彼が得た答えはUseAlarmManagerでしたが、Androidドキュメントでは、タイムアウトとティックにAlarmManagerを使用することを推奨しておらず、ハンドラーの使用を提案しています。

電話がスリープ状態になると問題が発生し始め、しばらくするとタイマーは30分ほどは機能しますが、数時間は機能しません...

4

2 に答える 2

1

いくつかの概念..。

スリープモード

ユーザーの操作WAKE_LOCKがない場合、または要求された場合、Androidカーネルは(デフォルトで)スリープモードになります。これは、バッテリーの使用率を最小限に抑えるために行われ、コードの実行が停止することを意味します。

アラームマネージャー

これは、カーネルを起動してコードの実行を開始するようにtimmerイベントを設定できるAPIです。アプリケーションが長いアクティビティを実行する必要がある場合は、ウェイクリックを要求する必要があります。そうしないと、カーネルは短時間で再びスリープモードになります。

アプリケーションで何が起こっているのか

デバイスがスリープ状態になるとすぐにサービスが停止します。ユーザーによって、または電話機の他のアプリケーションによって行われたアラームマネージャの要求によってデバイスがスリープ解除されると、サービスが再開されます。電話が再びスリープ状態になると、サービスもスリープ状態になります。

あなたがすべきこと

まず、電話がしばらく使用されていないとき(スリープモードにする必要があるとき)に本当に更新を実行する必要があるかどうかを慎重に検討する必要があります。たぶん誰もそれを使用しておらず、サービスを継続的に実行していると、バッテリーを消耗し続けるでしょう。

サービスを継続的に実行する必要がない場合は、次の2つのオプションがあります。

アラームマネージャーを使用する

一定の間隔でデバイスをウェイクアップし(可能な限り少ない頻度を使用)、サービス作業を更新します。これに時間がかかる場合は、をリクエストし、WAKE_LOCK完了後にリリースしてください。

最後に使用

ユーザーが電話をスリープ解除して更新するのを待つことができれば、サービス作業はさらに優れています。最後の1つを除いて、すべての更新要求をドロップするだけです。

ついに

サービスを継続的に実行する必要がある場合はWAKE_LOCK、サービスの開始時にリクエストしてください。バッテリーライブで支払うことを忘れないでください。

Note:Timer、または他のものを使用するかどうかはHandler関係ありませんが、上記は常に適用されます。

よろしく。

于 2012-11-21T20:25:49.633 に答える
-1

おそらく、ScheduledExecutorを試すことができます

于 2012-11-21T19:16:14.330 に答える