Почему активность возобновляется? Как этого избежать?
По ключевым словам "Перезапуск активности" запущено несколько потоков. Честно говоря, я сделал все возможное, прежде чем размещать здесь.
В моем приложении фоновая служба контролирует датчики (даже когда экран выключен) и запускает активность. Чтобы включить экран и показать активность на экране блокировки, я установил следующие флаги
int flags = WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON |
WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
WindowManager.LayoutParams lp = getWindow().getAttributes();
lp.flags |= flags;
Все идет отлично, Экран включается, Активность отображается на экране блокировки. Но активность возобновляется. Я не знаю почему? Эта ориентация деятельности установлена на портрет. Таким образом, изменение конфигурации ориентации не должно перезапускать активность. Я не смог найти причину перезагрузки. Что еще может быть причиной перезапуска?
Чтобы избежать перезапуска, я также установил Android: configChanges (чтобы найти причину, я включил все возможные изменения конфигурации
<activity android:label="@string/tstActivity_label"
android:name=".TstActivity"
android:screenOrientation="portrait"
android:noHistory="true"
android:excludeFromRecents="true"
android:configChanges="locale|keyboard|keyboardHidden|
navigation|orientation|screenLayout|
screenSize|smallestScreenSize|layoutDirection" >
</activity>
По-прежнему никаких положительных признаков, активность возобновляется. Также onConfigurationChanged(Configuration newConfig) никогда не вызывается.
Может ли кто-нибудь помочь мне найти причину перезапуска и как ее избежать?
Почему android:configChanges игнорируется.
Протестировано с уровнями API 14 и 15.
Моя основная проблема: я выполняю некоторые действия в onStop(), которые следует выполнять только тогда, когда действие действительно прекращается, а не во время его перезапуска.
Спасибо.
Примечание: я также пробовал с wakelocks и менеджером keygaurd, та же самая история Activity перезапускается.
2 ответа
Деятельность не "воссоздается", она только "перезапускается". Это нормальная часть жизненного цикла деятельности. Если действие было воссоздано из-за изменения конфигурации, вы также увидите onDestroy()
а также onCreate()
вызывается снова. Это явно не тот случай.
Здесь не происходит никаких изменений конфигурации, поэтому onConfigurationChanged()
не вызывается.
Я думаю, что происходящее связано с тем, что при запуске вашей активности экран отключен / заблокирован. Действие создается и возобновляется, но затем Android замечает, что экран выключен / заблокирован, поэтому он приостанавливает действие. Затем он понимает, что активность должна быть показана, и возобновляет ее. Я не могу сейчас проверить этот случай точно, но я уверен, что я видел подобное поведение в моих собственных приложениях, когда мы запускаем действие, когда экран выключен.
Ваше приложение должно быть в состоянии справиться с несколькими вызовами onStart()
, onStop()
, onRestart()
, onPause()
а также onResume()
не запутавшись. Если нет, вам нужно это исправить.
Используйте обработчик. Во время onCreat() отправьте сообщение обработчику с задержкой, скажем, 100 мс. С этого времени моя деятельность останавливается и возобновляется. Теперь, когда сообщение получено обработчиком, запускается актуальная функциональность. В моем случае, когда сообщение получено, я запускаю музыку и в onStop() без каких-либо условий останавливаю музыку.