3

サーバーからデータをダウンロードするがあり、一定の間隔でサーバーの更新をチェックしIntentServiceたいと考えています。IntentServiceただし、次の投稿ではService、 - を使用して a を繰り返さないようにアドバイスしTimer、代わりに を使用することを強調していAlarmManagerます。

サービスが Android で動作しないのはなぜですか? (5秒ごとに何かを記録したいだけです)

Android - サービス: 1 回だけ繰り返す

Android サービスが停止します

Android のリファレンス マニュアルでは、IntentService は次のように説明されています。

IntentService は、オンデマンドで非同期要求 (インテントとして表現) を処理するサービスの基本クラスです。クライアントは startService(Intent) 呼び出しを介してリクエストを送信します。サービスは必要に応じて開始され、ワー​​カー スレッドを使用して各インテントを順番に処理し、作業がなくなると停止します。

この「ワーク キュー プロセッサ」パターンは、アプリケーションのメイン スレッドからタスクをオフロードするために一般的に使用されます。IntentService クラスは、このパターンを簡素化し、メカニズムを処理するために存在します。これを使用するには、IntentService を拡張し、onHandleIntent(Intent) を実装します。IntentService はインテントを受け取り、ワーカー スレッドを起動し、必要に応じてサービスを停止します。

すべてのリクエストは 1 つのワーカー スレッドで処理されます。必要なだけ時間がかかる場合がありますが (アプリケーションのメイン ループをブロックすることはありません)、一度に処理されるリクエストは 1 つだけです。

私が本当に理解していない部分は、実行のために独自のワーカースレッドを作成するため、タイマーを使用して繰り返し実行することが許可されていない理由IntentServiceです。内でa を使用することは許されますか? または、定期的に実行する唯一のソリューションですか?ServiceIntentServiceTimerIntentServiceAlarmManagersIntentService

これについての説明をいただければ幸いです。

4

1 に答える 1

8

それとも AlarmManagers が IntentService を定期的に実行する唯一のソリューションですか?

確実に動作させたい場合は、はい。使用するAlarmManagerことも、ユーザーにとってはるかにフレンドリーです。

まず、ユーザーに積極的に価値を提供している場合を除いて、いかなる形式の も実行しないでください。時計の刻みを監視することは、積極的にユーザーに価値を提供していません。実行中のプロセスは、将来の作業のためにシステム RAMを解放するために終了するプロセスに関して、他のプロセスよりも少し高い優先度を与えます。不必要に動き回ると、システム RAMを不必要に占有するため、ユーザーがマルチタスクをうまく実行できなくなります。ServiceServiceService

この動作により、一部のユーザーは最近のタスク リストからアプリをスワイプするなど、タスク キラーであなたを攻撃します。これによりプロセスが終了するため、プロセスも終了しますTimer。同様に、あまりにも多くのずさんな開発者がService長期間にわたって活動を続けているため、Android はしばらくするとそのようなプロセスを自動的に終了しますが、Serviceそれでも.

最後に、通常、「一定の間隔でサーバーの更新を確認する」の 1 つの側面は、デバイスがスリープ モードになってもこの作業が行われるようにすることです。永遠のサービス アプローチでは、WakeLock.. これはユーザーのバッテリーに大きな影響を与え、アプリが設定アプリの「バッテリー障害画面」に表示される原因となります。これは、システム RAM の「機能」と組み合わせると、アプリの評価が低くなる可能性があります。

代わりに、次を使用しAlarmManagerます。

  • 作業IntentServiceを行っている間 (「サーバーの更新を確認する」) だけ実行する必要があり、これらのイベントの間に離れて、プロセスを終了して、ユーザーが行っている他のことのためにシステム RAM を解放できます。

  • WakefulBroadcastReceiverまたはパターンを使用することでWakefulIntentService、デバイスを一時的にウェイクアップしてこの作業を実行してから、デバイスを再びスリープ状態に戻すことができるため、バッテリーへの影響を最小限に抑えることができます。

于 2014-06-16T11:02:02.977 に答える