Почему сервис Android не тестируется во время тестирования? - PullRequest
4 голосов
/ 08 февраля 2012

При работе с большим набором тестовых наборов я заметил, что один из моих сервисов Android больше не одноразовый.Сервис Android должен быть одноэлементным, но при использовании ServiceTestCase мой счетчик ссылок превысил 1. (увеличен в onCreate, уменьшен в onDestroy).Вызов startService или bindService из тестового случая должен приводить к появлению второго onBind или onStartCommand, но никогда не должен приводить ко второму onCreate до первого onDestroy.

Это из-за того, что юнит-тест обходит Zygote?И если так, как я могу это исправить?

1 Ответ

5 голосов
/ 29 февраля 2012

Я заметил, что одна из моих служб Android больше не является одиночной

Службы Android являются одиночными, независимо от того, запускаете ли вы / привязываете ее в реальной рабочей среде или в ходе тестирования инструментов.Под синглтоном я подразумеваю уникальный объект, находящийся в куче, который может иметь несколько ссылок на него.

Вызов startService или bindService из тестового случая должен привести к секунде onBind или onStartCommand

, что не соответствует действительности, как указано в официальном руководстве разработчика: "Несколько клиентов могут подключиться к сервису одновременно. Однако система вызывает метод onBind () вашей службы для получения IBinder только тогда, когда первый клиент связывается. Затем система доставляет тот же IBinder всем дополнительным клиентам, которые связываются, без вызова onBind () снова. "

, но никогда не должно приводить к созданию второго onCreate перед первым onDestroy

Согласно официальному руководству разработчика: " Если выразрешите запуск и привязку вашей службы, затем, когда служба запущена, система не уничтожает службу, когда все клиенты отменяют привязку. Вместо этого вы должны явно остановить службу, вызвав stopSelf () или stopService (). "

Таким образом, сценарий за кулисами заключается в том, что при первом вызове службы start или bind Service, ServiceМетод .onCreate () вызывается ((перед вызовом onStartCommand () или onBind ()) для создания уникального объекта в куче, и возвращается ссылка на него (счетчик ссылок = 1), после этого каждый раз, когда вы вызываете startили связать службу, Service.onStartCommand () выполняется без создания нового объекта (путем вызова Service.onCreate ()) в куче, вместо этого, возвращая вторую контрольную точку к тому же объекту (теперь счетчик ссылок = 2), каждый раз, когда вывызовите unbind, счетчик ссылок уменьшится на единицу, пока счетчик ссылок не достигнет 0, вызов метода Service.onDestroy () и, наконец, очистка объекта в куче.

Вы можете найти все детали, на которые я ссылался курсивом изофициальное руководство разработчика здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...