gpt4 book ai didi

android - 为什么Android服务在测试时不是单例的?

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

在运行大量测试套件时,我注意到我的一个 Android 服务不再是单例。 Android 服务应该是单例的,但是当使用 ServiceTestCase 时,我的引用计数超过了 1。(在 onCreate 中增加,在 onDestroy 中减少)。从测试用例调用 startService 或 bindService 应该会导致第二个 onBind 或 onStartCommand,但绝不会在第一个 onDestroy 之前导致第二个 onCreate。

是不是单元测试绕过了Zygote?如果是这样,我该如何解决?

最佳答案

I noticed that one of my Android Services isn't singleton anymore

Android 服务是单例的,无论你是在真实运行环境下启动/绑定(bind)它还是在仪器测试下。单例是指存在于堆中的唯一对象,可以有多个引用指向它。

Calling startService or bindService from a testcase should result in a second onBind or onStartCommand

这不是真的,正如官方开发指南中所述:“多个客户端可以同时连接到该服务。但是,系统仅在第一个客户端时调用您服务的 onBind() 方法来检索 IBinder绑定(bind)。然后,系统将相同的 IBinder 传递给任何其他绑定(bind)的客户端,而无需再次调用 onBind()。”

but should never result in a second onCreate before the first onDestroy

根据官方开发指南:“如果您确实允许启动和绑定(bind)您的服务,那么当服务启动时,系统不会在所有客户端解除绑定(bind)时销毁该服务。相反,您必须通过调用 stopSelf() 或 stopService() 显式停止服务。”

所以幕后的场景是,当您第一次调用启动或绑定(bind)服务时,将调用 Service.onCreate() 方法((在调用 onStartCommand() 或 onBind() 之前)在堆上创建一个唯一的对象并返回对它的引用(引用计数 = 1),此后,每次调用启动或绑定(bind)服务时,都会执行 Service.onStartCommand() 而不会在堆上创建新对象(通过调用 Service.onCreate()),相反,返回同一个对象的第二个引用点(现在引用计数 = 2),每次调用解除绑定(bind)时,引用计数减一,直到引用计数达到 0,调用 Service.onDestroy() 方法并最终清理堆上的对象。

您可以从官方开发指南中找到我以斜体形式引用的所有详细信息 here .

关于android - 为什么Android服务在测试时不是单例的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9193775/

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