2009-07-01 72 views
13

我創建了一個使用相機的應用程序,並且在應用程序執行過程中屏幕始終處於打開狀態。Android:應用程序終止時如何釋放資源?

在onCreate()方法我加了鎖:

final PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
this.mWakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "My Tag"); 
this.mWakeLock.acquire(); 

而且這是被覆蓋的的onStop()方法:

@Override 
protected void onStop() { 

    if(mWakeLock.isHeld()) 
    { 
     mWakeLock.release(); 
    } 

    super.onStop(); 
} 

但是,應用程序終止後屏幕保持上的所有如果我運行相機應用程序,它會遇到一個明顯出現的錯誤,因爲相機資源沒有被釋放。

有誰知道如何釋放應用程序終止時的所有資源?

回答

13

我會鎖定移動從OnCreate()OnResume()。您希望在活動的可見生命週期中鎖定,而不是活動的整個生命週期。您的Activity可能仍然在運行另一個在其前面運行的Activity。

我會釋放移到OnPause()OnPause()是您的應用程序通常應該被操作系統殺死的最早時間點。

此外,我也不會檢查,看看是否我釋放之前有鎖。如果您使用OnResume()獲取鎖定; isHeld應始終在OnPause()

+1

你的建議不檢查鎖定狀態是確定的,如果釋放()是冪等操作。如果不是,那很糟糕。如果應用未能獲得鎖定並想關閉該應用,該怎麼辦? – Thushan 2009-07-02 20:23:51

1

你打電話給finish()?

你應該釋放你在的onPause,而不是資源的onStop。無法保證在您的活動死亡之前,onStop將始終被調用。如果系統需要資源,那麼它可能會在調用onStop之前終止活動。

嘗試把調試日誌和跟蹤執行路徑,當你認爲你的應用程序被終止。

3

這聽起來好像你的應用程序永遠不會調用Wakelock上的發佈 - 是否有可能在onStop或之前拋出異常?我會在你要調用release的地方加入一些日誌記錄來確認它正在執行。

在任何情況下,你肯定會想在acquirerelease方法進入onResume和分別。您獲得的代碼僅在您的應用程序第一次啓動時纔會獲得WakeLock。

感謝Android的後臺處理你的代碼有一個潛在的不平衡。如果用戶按Home鍵切換應用程序,鎖定將被釋放。如果他們切換回你的應用程序onCreate將不會被調用,所以鎖永遠不會被獲取。

最好的辦法是在onCreate中構建WakeLock(如你所見),獲取onResume中的鎖定並在onPause中釋放它(包括調用isHeld)。這將保證當你的應用程序處於前臺時鎖定將被保持。

2

我在使用OpenGL時遇到了麻煩,無法發佈數據。所以現在,用android.os.Process.killProcess(android.os.Process.myPid());它就像我想要的一樣工作!

感謝藝術

3

我用mWakelock.setReferenceCounted(假的),還是不知道這意味着什麼,但它解決了我的「激活鎖定在鎖定」的問題。

初始化:的OnStart() 獲取:的onResume() 版本:的onStop()