Жизненный цикл активности во время тайм-аута дисплея телефона - PullRequest
0 голосов
/ 30 января 2011

Сегодня я заметил кое-что довольно интересное.Жизненный цикл активности, кажется, имеет небольшое расхождение, когда время ожидания дисплея телефона истекло.Позвольте мне объяснить на примере.

У меня есть действие, которое использует акселерометр для вибрации телефона.В событии onPause я отменяю регистрацию слушателя SensorManager, чтобы не вызывать вибрацию телефона, когда моя деятельность больше не является основным фокусом.

Однако я заметил, что дисплей отключается изатем возвращается к моей активности, зарегистрированный SensorManager слушатель еще до того, как я разблокирую экран, ввожу свой пароль, и моя активность отображается.

Теперь я понимаю, что это моя собственная интерпретация того, как я этого ожидаюработать, но мне это кажется довольно странным, так как моя деятельность еще не в центре внимания.Я ожидал, что слушатель SensorManager не был зарегистрирован, потому что onResume еще не был вызван.Это явно не тот случай, когда я могу заставить свой телефон вибрировать как с экрана блокировки, так и с экрана пароля.

Итак, кто-нибудь может объяснить, почему это происходит?Во-вторых, что я могу сделать, чтобы обойти это?

Спасибо.

РЕДАКТИРОВАТЬ для ясности

Я использую акселерометр, чтобы вызвать вибрацию, перемещаятелефон.Это достигается с помощью SensorManager слушателя.

Сценарий:

Моя деятельность находится на переднем плане (основной фокус).Я запускаю вибрацию, перемещая телефон.Тайм-аут дисплея.В этот момент я не могу вызвать вибрацию.Я нажимаю home / power, чтобы показать экран.Теперь я могу вибрировать мой телефон, даже если отображается экран блокировки или экран пароля, и моя активность находится не на переднем плане.

Я не могу проверить причину, по которой я не могу вибрировать телефон, когда дисплей отключаетсяэто потому, что onPause был вызван или что-то присуще ОС, которая препятствует этому.Или, другими словами, я также не могу проверить, был ли вызван onResume при включении дисплея.

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

Ответы [ 3 ]

2 голосов
/ 08 сентября 2011

Вы сказали это.

"ожидал, что прослушиватель SensorManager не был зарегистрирован, потому что onResume еще не был вызван. Это явно не тот случай, когда я могу заставить свой телефон вибрировать от обоихэкран блокировки и экран пароля. "

onResume вызывается перед разблокировкой телефона

2 голосов
/ 12 ноября 2011

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

public class ExampleActivity extends Activity {

   @Override
    protected void onCreate() {
        IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
        filter.addAction(Intent.ACTION_SCREEN_OFF);
        BroadcastReceiver mReceiver = new ScreenReceiver();
        registerReceiver(mReceiver, filter);
    }

    @Override
    protected void onPause() {
        if (ScreenReceiver.wasScreenOn) {
            System.out.println("onPause() called because screen turned off.");
        } else {
            System.out.println("normal onPause() call");
        }
        super.onPause();
    }

    @Override
    protected void onResume() {
        if (!ScreenReceiver.wasScreenOn) {
            System.out.println("onResume() called when screen turns on");
        } else {
            System.out.println("normal onResume() call");
        }
        super.onResume();
    }

}
0 голосов
/ 30 января 2011

Ах.Ваша правка говорит нам, почему это происходит.

Проблема в том, что, когда ваш "экран отключается", и телефон гаснет, то происходит то, что телефон на самом деле спит.ОС, вероятно, переходит в состояние низкого энергопотребления и включает слушателей для различных вещей и, возможно, выключает акселерометр и / или вибратор.

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

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

...