为什么Android服务在测试时不是单身?

Huu*_*pke 4 service junit singleton android

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

这是因为单元测试是绕过Zygote吗?如果是这样,我该如何解决这个问题呢?

yor*_*rkw 5

我注意到我的一个Android服务不再是单例了

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

从测试用例调用startService或bindService应该导致第二个onBind或onStartCommand

这是不正确的,因为官方的开发者指南中指出:."多个客户端可以连接到服务一次.然而,系统调用服务的onBind()方法来检索的IBinder只有当第一个客户端绑定系统然后提供与任何其他绑定客户端相同的IBinder,而无需再次调用onBind()."

但是在第一次onDestroy之前永远不应该导致第二次onCreate

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

所以幕后的情况是,通过第一次调用启动或绑定服务,Service.onCreate()方法被调用((调用或者onStartCommand()或onBind())在堆上和参考创建独特的对象之前到返回它(引用计数= 1),在这之后,每次通话开始或绑定服务,Service.onStartCommand()是不创建新对象进行(通过调用Service.onCreate())上堆,而是返回第二参考点到相同的对象(现在参考计数= 2),在每次调用解除绑定,引用计数减一,直到引用计数达到0时,Service.onDestroy()方法被调用并最终清理对象上堆.

您可以在此处的官方开发指南中找到我在斜体中引用的所有详细信息.

  • 在配置更改时,可能会多次调用@Huupke AFAIK`onCreate()`.但不用担心 - "服务"是单身人士:) (2认同)