onNewIntent () не будет срабатывать, пока телефон не проснется - PullRequest
3 голосов
/ 28 марта 2012

Я обнаружил какое-то интересное поведение и не знаю, почему и как его обойти. Действие - это однозадачное действие, что означает, что onNewIntent () предназначен для действия, когда действие находится на вершине стека. Это работает хорошо и хорошо, , пока экран телефона включен . Однако, как только экран выключен, новое намерение не принимается, пока телефон не «проснется» и в этот момент вызывается onNewIntent (). Если действие не находится наверху стека, и телефон спит, то действие запускается и вызывается метод onCreate ().

Активность объявлена ​​как:

<activity android:name=".MyActivity" 
          android:launchMode="singleTask" 
          android:alwaysRetainTaskState="true" >

Активность также запускается с флагом FLAG_ACTIVITY_NEW_TASK. Намерение запускается с приемника вещания. Если телефон спит и намерение транслируется, активность разбудит телефон с такими флажками:

    getActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); 
    getActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);

Однако действие не создается, пока телефон не проснется, когда он находится на вершине стека. Прямо сейчас я озадачен и не уверен, с чего начать. Также моя деятельность использует onSaveInstanceState (). Операция является FragmentActivity и содержит один фрагмент.

Любая помощь будет принята с благодарностью!

1 Ответ

2 голосов
/ 28 марта 2012

Однако активность не создается до тех пор, пока телефон не проснется, когда он находится на вершине стека.

Насколько я знаю, это по замыслу.Единственный способ разбудить телефон и держать его в бодрствующем состоянии - это захватить пробуждение от блокировки.

http://developer.android.com/reference/android/os/PowerManager.WakeLock.html

Типичным примером является то, что вы получаете какое-то намерение разбудить свое приложение, например:состояние сети изменилось или что-то еще.В вашем приемнике, в onHandleIntent(), вы захватываете замок.Вы запускаете службу, чтобы выполнить какую-то работу, и служба снимает блокировку после ее завершения.

В вашем случае получатель, отправляющий намерение вашей активности, может захватить частичную блокировку пробуждения, а затем вашу активность.может захватить блокировку экрана.Имейте в виду, что, пока вы удерживаете блокировку от будильника, телефон не может спать, что приводит к значительному увеличению заряда аккумулятора.По этой причине пробужденные замки очень опасны.

Обратите внимание, что вы должны снять блокировку вручную.Если при возврате onHandleIntent() не удерживать блокировку от пробуждения, устройство может снова вернуться в режим сна.Таким образом, это будет что-то вроде

receiver: acquire partial lock
activity: acquire screen lock
activity: release partial lock

Вы также можете, вероятно, просто временно заблокировать блокировку экрана, затем отпустить ее ... экран включится, а затем выключится нормально в соответствии с настройкой тайм-аута дисплея.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...