Подтвердить что ты не робот

Сохранять активность, когда экран выключен

У меня есть служба, которая запускает новое действие, а экран выключен. Я хочу, чтобы активность оставалась в режиме паузы, а не в режиме остановки. Есть ли способ достичь этого?

4b9b3361

Ответ 1

Нет. У вас нет контроля над жизненным циклом активности. Любые процессы, которые нужно запустить во время выключения экрана, должны выполняться в Service. Вы должны перестроить состояние приложения, когда экран снова включен. Всегда предполагайте, что Activity можно стереть из памяти в любое время.

Ответ 2

Вы не можете этого сделать. он все равно будет убит. но вы можете использовать Service для приема трансляции Intent.ACTION_SCREEN_ON и перезапуска из Сервиса. перезагрузить свою активность из проверки обслуживания здесь

Ответ 3

Невозможно достичь этого. Ваше приложение привязано к жизненному циклу активности и должно разбивать/восстанавливать действия для работы с жизненным циклом.

Ответ 4

Вы не можете переопределить метод onDestroy(), и каждая версия ОС обрабатывает, как приложение "убито" по-разному.

Документация разработчика Android позволяет ссылаться на приложение, находящееся в состоянии "killable". Хотя Android пытается сохранить процесс приложения резидентным даже после его выхода (т.е. После onDestroy), он должен уметь убивать эти процессы в ситуациях с низким уровнем ресурсов для восстановления памяти. Состояние, в котором приложение является допустимым, отличается для каждой версии ОС. Во всех версиях Android приложения, которые вернулись из onStop или onDestroy, становятся тихими. В версиях Android до Honeycomb приложения, которые вернулись из onPause, также были убиты. Быть гибким, просто означает, что Android оставляет за собой право прекратить процесс ваших приложений в любое время, даже не выполнив еще одну инструкцию вашего кода приложения. Другими словами, если у вас есть какое-либо состояние, которое необходимо восстановить (например, ход игры игроков, предметы, награды и т.д.), Вы должны сохранить их в постоянном хранилище не позднее последнего обратного вызова перед входом в состояние killable.

Кроме того, хотя приложения могут запускать собственные потоки, даже если они находятся в состоянии состоянии и даже после onDestroy, этого следует избегать, так как процесс kill также убьет эти потоки. Это может вызвать все проблемы с коррупцией и отключением.

Источник

Ответ 5

Я не совсем понимаю, что вы имеете в виду с приостановленным режимом или остановленным режимом. Если вы имеете в виду, что процессор продолжает просыпаться, посмотрите this.

С partial_wake_look вы можете иметь длинную версию AsyncTask, например, также, когда экран включен. Не забудьте освободить wakelook.

Ответ 6

Зачем вам это нужно? Возможно, лучшим решением является запуск этого сервиса, как это было предложено компанией @DeeV. Однако, в зависимости от того, что вам нужно сделать, это может помочь:

Попросите Android уведомить вас, когда экран включен (и выключить, если необходимо). Таким образом, ваша деятельность может быть возобновлена ​​и немедленно запущена, и вы можете выполнить любое действие.

Для этого:

  • Создайте класс, который расширяет Application
  • Зарегистрируйте его в своем манифесте:
  • В public void onCreate() {..., добавьте это:

    IntentFilter ioff = новый IntentFilter (Intent.ACTION_SCREEN_OFF);

    IntentFilter ion = новый IntentFilter (Intent.ACTION_SCREEN_ON);

        broadcastReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                String action = intent.getAction();
    
                if (Intent.ACTION_SCREEN_OFF.equals(action)) {
                    //TODO
                } else {
                    //TODO
                }
            }
        };
    
        context.registerReceiver(broadcastReceiver, ioff);
        context.registerReceiver(broadcastReceiver, ion);
    
    • в public void onTerminate() {..., добавьте это:

if (broadcastReceiver != null) { context.unregisterReceiver(broadcastReceiver); }

Ответ 7

Lame hack будет вызывать метод onPause() внутри onStop() активности