Service
走っている vsService
走っていない
Process
各アプリには、アプリの実行時に開始されるものが少なくとも 1 つあります。そのプロセスは少なくともいくらかのメモリを使用し、人々はそれを解放するためにタスク キラーを使用することを好みますが、実際にメモリが必要になると、Android は自動的にそれを行います。このメモリは、Service
ケースにとって間違いなく不利です。
CPU / バッテリーの使用量が増加するのは、何かが発生して CPU を積極的に使用している場合、またはアプリがシステムにリソースを有効に保つよう強制している場合 ( WakeLock
. これを何も行わないと、アプリは約 0 CPU / バッテリーを使用し、再起動を高速化するためにメモリに保持される停止したアプリのように動作します。コードが実行されている場合は、リソースを誤って使用する可能性が高くなります。
Service
/Activity
がまったく実行されておらず、マニフェストに a を登録するだけの場合BroadcastReceiver
は、基本的に、ブロードキャストを送信するときにチェックするレシーバーのリストにレシーバーを含めるようにシステムに指示します。非常に最小限の追加作業。
マニフェスト レシーバーには、メモリ プレッシャが高いときにシステムが強制終了されないという利点もあります。これらのレシーバーは機能するだけで、まったく気にする必要はありません。必要に応じて、それらを有効/無効にすることもできます。
ContentObserver
対BroadcastReceiver
//両方とも、通常「UI スレッド」と呼ばれる // メカニズムを使用する必要があります。このメカニズムは、すべてのイベントをアプリに配信し、すべてのActivityThread
などのメソッドを呼び出します。これらのメソッドで何かが壊れたときに、スタック トレースを見ると簡単にわかります。Looper
MessageQueue
onCreate
onTouch
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#onCreate
etc メソッドのいずれかでコンテンツをダウンロードするなどの長時間実行される操作を行うと、たとえばActivity#onCreate
.