Принятый ответ от mbaird попадает в самую точку. Предлагаемый метод onVisivilityChange()
, если он будет реализован, должен охватывать все вышеперечисленные случаи.
Между тем, это все еще реальная проблема для некоторых типов виджетов. jom представил возможность регистрации для получения намерений ACTION_SCREEN_OFF / ACTION_SCREEN_ON. Это полезно, потому что недостаточно полагаться на повторяющийся сигнал тревоги, не связанный с пробуждением, поскольку другие службы вызывают пробуждение. Это сложно, потому что на такие действия нельзя подписаться через AndroidManifest.xml, а AppWidgetProvider не разрешено вызывать context.registerReceiver()
. Эти проблемы обсуждаются в нескольких других вопросах StackOverflow, включая Прослушивание ACTION_SCREEN_OFF, android.intent.action.SCREEN_ON не не работает как фильтр намерений получателя и Android - как получить намерения трансляции ACTION_SCREEN_ON / OFF?.
Мне удалось подписаться на намерения ACTION_SCREEN_OFF / ACTION_SCREEN_ON в виджете, создав дочерний экземпляр BroascastReceiver
и используя context.getApplicationContext().registerReceiver()
для его регистрации. Это вполне могло быть обманом и, по крайней мере, в некоторых последующих версиях Android, может произойти сбой на этапе регистрации или, возможно, события просто не будут доставлены. Я написал код для обработки этих случаев, но пока это работает. К сожалению, конечно, это не сработает, если и когда приложение когда-либо будет убито.
Другая возможность - использовать метод типа isHomeScreenShowing()
, как описано здесь, на который ссылается ответ xandy. Идеи там, вероятно, можно было бы оптимизировать, кэшируя сгенерированный список установленных CATEGORY_HOME
приложений и прослушивая широковещательные сообщения ACTION_PACKAGE_ADDED / CHANGED / REMOVED для его обновления.
Моя стратегия:
- Старайтесь не звонить (через повторяющийся сигнал), когда вас не видно.
- При вызове проверьте состояние экрана и другие индикаторы видимости, прежде чем делать что-нибудь дорогостоящее.
- Только после этого вызывайте
IntentService
для выполнения относительно дорогостоящей работы, которая включает постоянное сетевое соединение. Это необходимо для отслеживания состояния удаленной службы почти в реальном времени.
person
awy
schedule
07.09.2014