2012-08-07 67 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()後調用,否則可能不會。取決於情況。

相關問題