Я заметил, что одна из моих служб 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 () и, наконец, очистка объекта в куче.
Вы можете найти все детали, на которые я ссылался курсивом изофициальное руководство разработчика здесь .