2012-08-07 24 views
4

我似乎错过了一些东西,因为我不明白为什么在Android文档中(Android Camera doc. link)建议在onPause()Activity回调中释放Camera对象(以及MediaRecorder)?那时活动仍然可能可见,并且Camera可能正在运行预览,那么为什么当Activity已经隐藏时,Camera对象会在onPause()而不是onStop()中释放?我明白MediaRecorder对象可以在onPause()中停止,但Camera本身对我来说没有意义。我在这里错过了什么?从Android文档代码块低于(其下释放相机标题):为什么Camera需要在onPause()而不是onstop()方法的Activity中释放?

@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 
    } 
} 

回答

2

根据application lifecycle

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. (...) 

我认为“尽快释放资源”的文档遵循的经验法则:比onStop早。

摄像头在后台窗口需要能量而用户不得不注意弹出窗口。

背景中的相机当然更舒适,但对于移动电池而言,寿命更重要。

拦截您活动的弹出窗口可能需要相机和/或可能需要大量内存。

在你的情况下,当相机应继续记录在后台相机-S生命周期和记录应该由服务控制

+0

对,我刚刚检查了我的默认相机应用程序。在我的Android手机(Samsung Infuse)上,似乎当我开始录制时,我按住“home”按钮以进入“最近的应用程序。弹出窗口”,录制不会停止。我是否认为它在onStop中释放摄像头而不是在暂停?它也确实造成麻烦,因为从“最近的应用程序窗口”时,我导航到我的应用程序。这要求相机我得到例外。 – spirytus 2012-08-07 04:38:36

-1

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

仅当Android不认为您的进程需要了,才会调用onStop。

+0

嗯..据我所知onPause我的活动仍然部分可见,只有在onStop完全覆盖。就我所知,onStop活动仍然正常运行。我也认为,直到如果需要资源,android蜂窝活动可能会在onPause或onStop中被销毁。 – spirytus 2012-08-07 04:30:28

3

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

+1

这是真正的原因。新活动将在您的活动获得onStop()消息之前开始。因此,如果您不在onPause()中释放相机,并且新活动想要读取相机,则会出现错误。 – bleater 2013-04-03 01:19:17

0

由于onStop()不能保证被调用,你不能总是在做什么是onPause().

For Detail Answer

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

相关问题