当运行大量测试套件时,我注意到我的一个 Android 服务不再是单例的。 Android 服务应该是单例的,但是当使用 ServiceTestCase 时,我的引用计数超过 1。(在 onCreate 中递增,在 onDestroy 中递减)。
从测试用例调用startService或bindService应该会导致第二个onBind或onStartCommand,但绝不会在第一个onDestroy之前导致第二个onCreate。
这是因为单元测试绕过了 Zygote 吗?如果是这样,我该如何解决这个问题?
我注意到我的 Android 服务之一不再是单例的
无论您是在真实运行环境下还是在仪器测试下启动/绑定Android Services,它都是单例的。通过单例,我的意思是堆中存在一个唯一的对象,可以有多个引用指向它。
从测试用例调用startService或bindService应该会导致第二个onBind或onStartCommand
正如官方开发指南中所述,这是不正确的:“多个客户端可以同时连接到该服务。但是,系统仅在第一个客户端绑定时调用服务的 onBind() 方法来检索 IBinder。然后,系统将相同的 IBinder 传递给任何其他绑定的客户端,而不调用 onBind () 再次。”
但决不应该在第一个 onDestroy 之前导致第二个 onCreate
根据官方开发指南:“如果您允许启动并绑定服务,那么当服务启动后,当所有客户端解除绑定时,系统不会销毁该服务。相反,您必须通过调用 stopSelf() 或 stopService( )”。
因此,幕后的场景是,第一次调用启动或绑定服务时,将调用 Service.onCreate() 方法((在调用 onStartCommand() 或 onBind() 之前)在堆上创建一个唯一的对象和一个引用返回它(引用计数 = 1),之后,每次调用启动或绑定服务时,都会执行 Service.onStartCommand() ,而不在堆上创建新对象(通过调用 Service.onCreate()),而是返回第二个引用指向同一个对象(现在引用计数=2),每次调用unbind,引用计数减一,直到引用计数达到0,调用Service.onDestroy()方法,最后清理对象堆。
您可以在官方开发指南中找到我用斜体引用的所有详细信息here http://developer.android.com/guide/topics/fundamentals/bound-services.html#Basics.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)