4

アプリケーションのバッテリー使用量、RAM および CPU 使用量について必要な懸念があるため、複数のコンテンツ オブザーバーと複数のブロードキャスト レシーバーの費用はどうなるでしょうか?

例 1:

適切に登録/登録解除された 5 つのコンテンツ オブザーバーを使用して START_STICKY で実行されるサービス。

例 2:

マニフェストに設定された 5 つのブロードキャストレシーバーからサービスが起動されます。

例 3:

登録済みの5つのブロードキャストレシーバーを使用してSTART_STICKYで実行されるサービス。

オブザーバーとレシーバーの間のバッテリー使用量/RAM/CPUの真の違いは何ですか? プロはこれに参加できますか?1 つのインスタンスでは大した違いはないと思いますが、上記の例を一度に 5 つ実行してみましょう。

4

1 に答える 1

8

Service走っている vsService走っていない

Process各アプリには、アプリの実行時に開始されるものが少なくとも 1 つあります。そのプロセスは少なくともいくらかのメモリを使用し、人々はそれを解放するためにタスク キラーを使用することを好みますが、実際にメモリが必要になると、Android は自動的にそれを行います。このメモリは、Serviceケースにとって間違いなく不利です。

CPU / バッテリーの使用量が増加するのは、何かが発生して CPU を積極的に使用している場合、またはアプリがシステムにリソースを有効に保つよう強制している場合 ( WakeLock. これを何も行わないと、アプリは約 0 CPU / バッテリーを使用し、再起動を高速化するためにメモリに保持される停止したアプリのように動作します。コードが実行されている場合は、リソースを誤って使用する可能性が高くなります。

Service/Activityがまったく実行されておらず、マニフェストに a を登録するだけの場合BroadcastReceiverは、基本的に、ブロードキャストを送信するときにチェックするレシーバーのリストにレシーバーを含めるようにシステムに指示します。非常に最小限の追加作業。

マニフェスト レシーバーには、メモリ プレッシャが高いときにシステムが強制終了されないという利点もあります。これらのレシーバーは機能するだけで、まったく気にする必要はありません。必要に応じて、それらを有効/無効にすることもできます。

ContentObserverBroadcastReceiver

//両方とも、通常「UI スレッド」と呼ばれる // メカニズムを使用する必要があります。このメカニズムは、すべてのイベントをアプリに配信し、すべてのActivityThreadなどのメソッドを呼び出します。これらのメソッドで何かが壊れたときに、スタック トレースを見ると簡単にわかります。LooperMessageQueueonCreateonTouch

AndroidRuntime(521): FATAL EXCEPTION: main
AndroidRuntime(521): java.lang.RuntimeException: MotionEvent{405215b0 action=0 x=66.0 y=78.0 pressure=1.0 size=0.0} recycled twice!
AndroidRuntime(521):     at android.view.MotionEvent.recycle(MotionEvent.java:659)
AndroidRuntime(521):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1880)
AndroidRuntime(521):     at android.os.Handler.dispatchMessage(Handler.java:99)
AndroidRuntime(521):     at android.os.Looper.loop(Looper.java:123)
AndroidRuntime(521):     at android.app.ActivityThread.main(ActivityThread.java:3647)

ブロードキャストまたはコンテンツ変更通知が配信されない場合、そのスレッドは単に待機します。待機は CPU を使用しません (つまり、常にループをアクティブに循環させます) が、そのスレッドの処理時間をスケジュールする必要がないことをシステムに伝えます。その間、CPU 使用率は事実上 ~0 です。したがって、IMO では、実行時に 2 つのうちの 1 つを登録することにまったく違いはありません。

メソッドの 1 つに利点を与える唯一の違いは、メソッドがより頻繁にトリガーされる場合です。

1対5

重要ではない。システムには非常に多くのレシーバー/オブザーバーが存在するため、1 を追加しても 5 を追加しても実際には問題になりません。1000 のように追加すると、おそらく気付くでしょう。

補足: UI スレッドの動作をブロックしないでください。レシーバーとサービスには UI がありませんが、それらのコールバック メソッドは UI スレッドで実行されます。onReceiveしたがって、 / Service#onCreateetc メソッドのいずれかでコンテンツをダウンロードするなどの長時間実行される操作を行う、たとえばActivity#onCreate.

于 2012-09-07T12:58:47.160 に答える