gpt4 book ai didi

android - ContentObserver 与 BroadCastReceiver : Battery Usage, Ram、CPU?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:06:00 29 4
gpt4 key购买 nike

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

Example 1:

A service running with START_STICKY using 5 contentobservers registered/unregistered properly.

Example 2:

A service being fired from 5 broadcastreceivers set in the manifest.

Example 3:

A service running with START_STICKY using 5 registered broadcastreceivers.

观察者和接收者在电池使用/内存/CPU 方面的真正区别是什么?任何专业人士都可以对此发表意见吗?我假设 1 个实例不会产生太大影响,但让我们以同时运行 5 个实例为例。

最佳答案

Service 运行与没有 Service 运行

每个应用程序至少有一个 Process在您的应用程序运行时启动。该进程至少使用了一些内存,人们喜欢使用任务 killer 来释放它,尽管 Android 会在实际需要内存时自动执行此操作。对于 Service 情况,此内存绝对是一个劣势。

CPU/电池使用率只会在发生某些事情并因此主动使用 CPU 或当您的应用强制系统保持资源启用时增加,例如当你保留 WakeLock .如果您不执行任何这些操作,您的应用程序将使用大约 0 CPU/电池,并且非常像一个已停止的应用程序,它保存在内存中以加速重新启动它。如果您的代码正在运行,您无意中使用某些资源的可能性肯定会更高。

如果没有Service/Activity 正在运行,您只需注册一个BroadcastReceiver在您的 list 中,您基本上告诉系统将您的接收器包含在它在发送广播时检查的接收器列表中。非常少的额外工作。

Manifest receivers还有一个好处就是内存压力大的时候系统不会被kill掉。那些接收器只是工作,你根本不需要关心。你甚至可以enable / disable如果您愿意的话。

ContentObserverBroadcastReceiver

两者都应该使用 ActivityThread/Looper/MessageQueue机制通常被称为“UI 线程”,它将所有事件传递到您的应用程序并调用所有 onCreateonTouch 等方法。当您在这些方法中出现问题时查看堆栈跟踪时很容易看到:

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 在运行时注册两者之一之间没有任何区别。

可以给其中一种方法带来优势的唯一区别是,如果这些方法触发得更频繁。

1 对 5 个

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

旁注:不要阻止 UI 线程执行它的工作。尽管接收器和服务没有 UI,但它们的回调方法在 UI 线程上执行。因此,如果您执行任何长时间运行的操作,例如在任何 onReceive/Service#onCreate 等方法中下载内容,这将导致 ANRs和它做的一样在 Activity#onCreate 中。

关于android - ContentObserver 与 BroadCastReceiver : Battery Usage, Ram、CPU?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12309981/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com