为什么相机需要在Activity的onPause()方法中释放,而不是onStop()方法中释放?

4
我似乎缺少某些东西,因为我不明白为什么在Android文档中(Android相机文档链接)建议在onPause()活动回调中释放Camera对象(以及MediaRecorder)?此时Activity仍可能可见,并且相机可能正在运行预览,那么为什么相机对象应该在onPause()而不是在activity已经隐藏的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
    }
}
4个回答

3

当您的活动接收到onPause消息时,这意味着用户可能正在使用或将要使用其他应用程序。在这种情况下,如果他尝试通过其他应用程序使用相机,则相机必须由您的应用程序释放或释放。


1
这是真正的原因。新的活动将在您的活动收到onStop()消息之前启动。因此,如果您不在onPause()中释放相机,并且新的活动想要读取相机,则会出现错误。 - bleater

2
根据应用程序生命周期,Activity 是Android应用程序中的一种组件。
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. (...)

我认为文档遵循“尽早释放资源”的原则: onPauseonStop 之前执行。
当用户需要关注弹出窗口时,后台窗口中的相机需要能量。
当然,后台相机更舒适,但对于移动电池寿命来说,时间更重要。
拦截您活动的弹出窗口可能需要相机和/或大量内存。
在您的场景中,当相机应继续在后台录制时,相机的生命周期和录制应由服务控制。

我刚才检查了我的 Android 手机(三星 Infuse)上的默认相机应用程序,似乎当我开始录制并按住“主页”按钮以进入“最近应用程序弹出窗口”时,录制不会停止。 我想知道是否在 onStop 释放相机而非 onPause。 同时,这确实会导致麻烦,因为当我从“最近应用程序”窗口导航到请求相机的应用程序时,会出现异常。 - spirytus

0
由于不能保证 onStop() 会被调用,因此您不能总是在 onStop() 中执行 onPause() 中所做的操作。

详细答案

onPause() 总是会被调用。这是有保证的。如果您需要保存活动中的任何状态,则需要在 onPause() 中保存它。 onStop() 可能会在 onPause() 之后调用,也可能不会。这取决于情况。


-1

onPause意味着您的活动不再可见。

如果Android认为您的进程不再需要,则只会调用onStop。


嗯...据我所知,在onPause中,我的活动仍然部分可见,只有在onStop中才完全被覆盖。据我所知,在onStop中,活动仍然像平常一样运行。我还认为,在Android Honeycomb之前,如果需要资源,活动可能会在onPause或onStop中被销毁。 - spirytus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接