Я столкнулся с критическим своего рода конфликтом. Мое приложение - это удаленный сервис, который, по сути, запускает действие, когда экран переходит в режим сна. Как это сделать, очень просто с помощью экрана, отключенного от широковещательного приемника, а затем с явным намерением начать задание как новую задачу. Деятельность в основном отвечает за реагирование на ключевые события и отображение некоторого простого текста.
Благодаря нескольким оконным флагам, добавленным в 2.0, действия могут сделать это. Они могут быть созданы таким образом, чтобы либо поместить их поверх экрана блокировки, либо полностью закрыть экран блокировки. Таким образом, они в основном имеют фокусировку без блокировки экрана пользователем. Будильник в 2.0 использует флаги, чтобы разбудить устройство и показать диалог будильника. Я использую их для размещения своей активности, когда экран спит, поэтому пользователь видит пользовательский экран блокировки пробуждения. Причина, по которой мы создаем его при выключенном экране, состоит в том, чтобы избавиться от лагов, которые пользователь испытывает при пробуждении, когда сначала видят экран блокировки, а затем видят активность. Кроме того, выполнение этого немедленно во сне позволяет ему сосредоточиться, чтобы он мог эффективно обрабатывать ключевые события.
Процесс работает отлично, за исключением некоторых приложений. Пока что, похоже, ошибка исправлена во время работы браузера (и даже браузера дельфинов), а также приложения facebook. Ошибка никогда не происходит в GTalk или Launcher. Это редко, но все еще может дублироваться в приложении обмена сообщениями время от времени. Я не могу понять, почему моя активность не создается во время сна, когда эти приложения активны. Моя удаленная служба по-прежнему получает экран от широковещательной рассылки и выполняет startActivity для явного намерения, и это все, что я получаю в журнале. Мой onCreate не вызывается. Вместо этого он вызывается, когда мы снова просыпаемся.
В качестве элемента управления я попытался удержать частичную блокировку, начиная с момента создания моей удаленной службы, и проблема сохраняется. Так что я не верю, что проблема в том, что процессор перешел в режим сна. Поскольку только эти конкретные приложения приводят к дублированию проблемы, я не могу себе представить, почему не удается запустить действие. Что могут делать эти приложения, чтобы помешать созданию другого приложения? Я использую singleInstance в качестве режима запуска, чтобы я мог гарантировать, что активность никогда не сможет быть вызвана пользовательским процессом. Я хочу, чтобы он исчез, когда пользователь разблокируется, и он работает нормально, пока он может быть создан. SingleInstance гарантирует, что у меня может быть тот же дескриптор экрана блокировки, который намерен сделать что-то конкретное на основе действий пользователя, которые отслеживает удаленная служба.
мой исходный код можно посмотреть на странице моего проекта. http://code.google.com/p/mylockforandroid/source/browse/#svn/trunk/myLock/src/i4nc4mp/myLock
проблема возникает как с моими вариантами CustomLockService, так и с NoLockService. Эти два сервиса запустят Lockscreen или ShowWhenLockedActivity, и ошибка станет очевидной. Сборка, иллюстрирующая конечный результат ошибки - пользователь должен попытаться разблокировать 3 раза из-за ошибки, потому что при пробуждении, когда oncreate, наконец, завершается успешно, пользователь видит активность, когда обычно она автоматически отключается, благодаря логике ключевых событий, которая также похоже, не происходит из-за задержки onCreate, поэтому они должны отправить его снова спать. Теперь, когда действие правильно выполнено, когда он запущен, и экран спит, ожидаемая функциональность происходит при следующем пробуждении - можно также загрузить с вкладки загрузок.
Это кажется крайне иррациональной вещью, вызываемой только конкретными приложениями. Я совершенно сбит с толку и у меня нет идей для решения, если только я не совершил критическую ошибку в своих определениях деятельности.