2009-07-01 17 views
13

Ho creato un'applicazione che utilizza la fotocamera e durante l'esecuzione dell'applicazione lo schermo è sempre acceso.Android: come rilasciare le risorse quando l'applicazione termina?

Nel metodo onCreate() ho aggiunto il blocco:

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

E questo è il metodo sovresposta onStop():

@Override 
protected void onStop() { 

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

    super.onStop(); 
} 

Ma dopo la chiusura lo schermo rimane su tutto il tempo e se eseguo l'applicazione della telecamera, incontra un errore che appare evidentemente perché le risorse della fotocamera non vengono rilasciate.

Qualcuno sa come rilasciare tutte le risorse sulla terminazione dell'applicazione?

risposta

13

Vorrei spostare il blocco da OnCreate() a OnResume(). Desideri il blocco durante la vita visibile dell'attività, non l'intera durata dell'attività. L'attività potrebbe ancora essere ancora in esecuzione con un'altra attività in esecuzione di fronte ad essa.

Sposterei la versione su OnPause(). OnPause() è il primo punto in cui l'applicazione deve normalmente essere eliminata dal sistema operativo.

Inoltre, non vorrei verificare se ho il blocco prima di rilasciarlo. Se si utilizza OnResume() per acquisire il blocco; isHeld dovrebbe sempre essere true in OnPause().

+1

tuo suggerimento a non controllare per lo stato di blocco è ok se release() è un'operazione idempotente. In caso contrario, è male. Cosa succede se l'app non è riuscita a ottenere il blocco e desidera chiudere l'app? – Thushan

+1

Grande commento. Ho guardato il codice sorgente di Android. Sembra che l'unico modo in cui non riesci a ottenere un blocco è se malformi la tua chiamata, nel qual caso registra un errore ma non genera un'eccezione. Se si chiama release() senza acquisire un lock, si genera un'eccezione "WakeLock under-locked". La documentazione di acquire() induce a pensare se chiedi il lucchetto, otterrai il lucchetto. Ma se dovessi controllare, dovresti controllare subito dopo l'acquisizione(), non dopo che il programma è stato avviato e stai per uscire. – Will

1

Dove stai chiamando finish()?

Si dovrebbero rilasciare le risorse in onPause e non su onStop. Non c'è alcuna garanzia che onStop sarà sempre chiamato prima che la tua attività venga uccisa. Se il sistema ha bisogno di risorse allora può uccidere l'attività prima che venga chiamato onStop.

Provare a mettere i registri di debug e tracciare il percorso di esecuzione quando si ritiene che l'applicazione venga interrotta.

3

Sembra che l'applicazione non stia chiamando mai il rilascio su Wakelock - è possibile che stia generando un'eccezione in precedenza in onStop o ? Includerei alcune registrazioni in cui stai chiamando la versione per confermare che è in esecuzione.

In ogni caso, avrete sicuramente voglia di spostare le acquire e release metodi in onResume e rispettivamente. Il codice che hai acquisirà solo il WakeLock la prima volta che la tua applicazione verrà avviata.

Grazie all'elaborazione in background di Android, il codice presenta un potenziale squilibrio. Se l'utente preme il tasto Home per passare alle applicazioni, verrà rilasciato il blocco. Se tornano alla tua app, onCreate non verrà chiamato, quindi il blocco non verrà mai acquisito.

La soluzione migliore è costruire il WakeLock su onCreate (come avete), acquisire il blocco su Ridesume e rilasciarlo in onPause (inclusa la chiamata a isHeld). Ciò garantirà che il blocco verrà mantenuto ogni volta che l'applicazione è in primo piano.

2

Ho avuto problemi nel rilasciare i dati mentre stavo usando OpenGL. Così ora, con android.os.Process.killProcess (android.os.Process.myPid()); funziona proprio come voglio !!

Grazie Art

3

uso mWakelock.setReferenceCounted (false), ancora so cosa vuol dire, ma si risolve il mio problema "Wakelock sotto-bloccata".

Init: OnStart() acquisiscono: onResume() rilascio: onStop()

Problemi correlati