Почему активность возобновляется? Как этого избежать?

По ключевым словам "Перезапуск активности" запущено несколько потоков. Честно говоря, я сделал все возможное, прежде чем размещать здесь.

В моем приложении фоновая служба контролирует датчики (даже когда экран выключен) и запускает активность. Чтобы включить экран и показать активность на экране блокировки, я установил следующие флаги

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() без каких-либо условий останавливаю музыку.

Другие вопросы по тегам