ContentObserver 与 BroadCastReceiver:电池使用情况、RAM、CPU?

2024-03-15

由于需要关注应用程序的电池使用情况、RAM 和 CPU 使用情况,因此多个内容观察器与多个广播接收器的费用是多少?

示例1:

使用 5 个内容观察器以 START_STICKY 运行的服务 正确注册/取消注册。

示例2:

从清单中设置的 5 个广播接收器触发的服务。

示例3:

使用 5 个已注册的 START_STICKY 运行的服务 广播接收器。

观察者和接收者之间的电池使用/内存/CPU 的真正区别是什么?有哪位高手可以指点一下吗?我假设 1 个实例不会产生太大影响,但让我们以上面的示例为例,同时运行 5 个实例。


Service跑步与不跑步Service running

每个应用程序至少有一个Process http://developer.android.com/guide/components/processes-and-threads.html当您的应用程序运行时启动。该过程至少使用一些内存,人们喜欢使用任务杀手来释放内存,尽管 Android 在实际需要内存时会自动执行此操作。这对于内存来说绝对是一个缺点Service case.

仅当发生某些事情并因此积极使用 CPU 或当您的应用程序强制系统保持资源启用时(例如,CPU/电池使用量)才会增加。当你保留一个WakeLock http://developer.android.com/reference/android/os/PowerManager.WakeLock.html。如果您不执行任何此操作,您的应用程序将使用大约 0 CPU/电池,并且其行为非常像一个已停止的应用程序,该应用程序保存在内存中以加快重新启动的速度。如果您的代码正在运行,您无意中使用某些资源的可能性肯定会更高。

If no Service / Activity正在运行,你只需注册一个BroadcastReceiver http://developer.android.com/reference/android/content/BroadcastReceiver.html在清单中,您基本上告诉系统将您的接收器包含在发送广播时检查的接收器列表中。非常少的额外工作。

清单接收器还有一个优点,即当内存压力很大时系统不会被杀死。这些接收器只是工作,您根本不需要关心。你甚至可以启用/禁用 http://developer.android.com/training/monitoring-device-state/manifest-receivers.html如果您愿意的话。

ContentObserver vs BroadcastReceiver

两者都应该使用ActivityThread https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/java/android/app/ActivityThread.java / Looper https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/java/android/os/Looper.java / MessageQueue https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/java/android/os/MessageQueue.java通常称为“UI 线程”的机制,它将所有事件传递到您的应用程序并调用所有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。因此,在我看来,在运行时注册两者之一没有任何区别。

唯一可以给其中一种方法带来优势的区别是方法是否更频繁地触发。

其中1对5

不要紧。系统中有如此多的接收者/观察者,添加 1 或 5 并不重要。如果添加 1000 个,您可能会注意到

旁注:不要阻止 UI 线程完成它的工作。尽管接收器和服务没有 UI,但它们的回调方法是在 UI 线程上执行的。因此,如果您执行任何长时间运行的操作,例如在任何一个中下载内容onReceive / Service#onCreate等方法将导致ANRs http://developer.android.com/guide/practices/responsiveness.html同样的方式,例如在Activity#onCreate.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ContentObserver 与 BroadCastReceiver:电池使用情况、RAM、CPU? 的相关文章

随机推荐