Почему камера должна быть выпущена в onPause(), а не в onstop() методе Activity?

Кажется, я что-то упустил, поскольку не понимаю, почему в документации Android (Android Camera doc .ссылка) рекомендуется освобождать объект Camera (а также MediaRecorder) в обратном вызове onPause() Activity? К тому времени активность все еще может быть видна, и камера может запускать предварительный просмотр, так почему объект камеры будет выпущен в onPause(), а не в onStop(), когда активность уже скрыта? Я понимаю, что объект MediaRecorder может быть остановлен в onPause(), но сама камера для меня не имеет смысла. Что мне здесь не хватает? Фрагмент кода из документации Android приведен ниже (под заголовком «Освобождение камеры»):

    @Override
protected void onPause() {
    super.onPause();
    releaseMediaRecorder();       // if you are using MediaRecorder, release it first
    releaseCamera();              // release the camera immediately on pause event
}

private void releaseMediaRecorder(){
    if (mMediaRecorder != null) {
        mMediaRecorder.reset();   // clear recorder configuration
        mMediaRecorder.release(); // release the recorder object
        mMediaRecorder = null;
        mCamera.lock();           // lock camera for later use
    }
}

person spirytus    schedule 07.08.2012    source источник


Ответы (4)


в соответствии с жизненным циклом приложения

Paused
    Another activity is in the foreground and has focus, but this one is 
            still visible. That is, another activity is visible on top of this 
            one and that activity is partially transparent or doesn't cover the 
            entire screen. (...)

Я думаю, что документация следует эмпирическому правилу «освобождать ресурсы как можно скорее»: onPause раньше, чем onStop.

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

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

Всплывающему окну, которое перехватило вашу активность, может потребоваться камера и/или много памяти.

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

person k3b    schedule 07.08.2012
comment
хорошо, я только что проверил приложение камеры по умолчанию. на моем телефоне Android (Samsung Infuse), и кажется, что когда я начинаю запись и удерживаю кнопку «Домой», чтобы перейти к последним приложениям. всплывающее окно запись не останавливается. Я прав, думая, что он выпускает камеру в режиме onStop, а не в режиме Pause? Кроме того, это действительно вызывает проблемы, например, из последних приложений. окно, в котором я перехожу к моему приложению. который запрашивает камеру, я получаю исключение. - person spirytus; 07.08.2012

Как только ваша активность получает сообщение onPause, это означает, что пользователь может использовать или собирается использовать какое-то другое приложение. В этом случае, если он пытается использовать камеру через другое приложение, камера должна быть освобождена или выпущена вашим приложением.

person Daud Arfin    schedule 07.08.2012
comment
Это настоящая причина. Новая активность будет запущена ДО того, как ваша активность получит сообщение onStop(). Поэтому, если вы не отпустите камеру в onPause(), а новая активность захочет прочитать камеру, она получит ошибку. - person bleater; 03.04.2013

Поскольку вызов onStop() не гарантируется, вы не всегда можете делать в onStop() то, что делается в onPause().

Подробный ответ

onPause() всегда вызывается. Это гарантировано. Если вам нужно сохранить какое-либо состояние в вашей деятельности, вам нужно сохранить его в onPause(). onStop(), которое может быть вызвано после onPause(), а может и нет. Зависит от ситуации.

person AndroidGeek    schedule 04.05.2015

onPause означает, что ваша активность больше не видна.

onStop будет вызываться только в том случае, если Android сочтет, что ваш процесс больше не нужен.

person Pork 'n' Bunny    schedule 07.08.2012
comment
хм.. как я понимаю в onPause моя активность еще частично видна и только в onStop полностью прикрывается. Насколько я знаю, в onStop активность по-прежнему работает как обычно. Я также думаю, что до тех пор, пока активность Android Honeycomb может быть уничтожена либо в onPause, либо в onStop, если потребуются ресурсы. - person spirytus; 07.08.2012