Domanda

Ciao Sto cercando di utilizzare un servizio per controllare un Wakelock in modo da poter lasciare in modo permanente lo schermo quando la mia applicazione è in esecuzione. Creo il Wakelock e attivarlo in onCreate () e rilasciarla in OnDestroy () tuttavia ottengo l'errore "wl non può essere risolto". Qualcuno può spiegare come posso superare questa? Codice qui sotto:

public class WakeLockService extends Service {

    @Override
    public IBinder onBind(Intent arg0) {
        // TODO Auto-generated method stub
        return null;
    }  
    @Override
    public void onCreate() {
        PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
        PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "My Tag");
        wl.acquire();
    }
    @Override
    public void onDestroy() {
        wl.release();
    }
}
È stato utile?

Soluzione

Non Vi manca la riga

    PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "My Tag");

in OnDestroy ()? Si tratta di una variabile locale in onCreate (), ma non è dichiarata nel OnDestroy () a tutti.

O, più probabile, si può decidere di rendere un campo di classe WakeLockService invece di una variabile locale.

Altri suggerimenti

Bene, anche se si usa una variabile di istanza vorrei che questo non è il modo per farlo. Chi è gonna chiamata destroy()? Spero di no te, il lavoro del sistema operativo per farlo. Ma quando si è in possesso di una scia bloccarlo è altamente improbabile che il metodo destroy() ottenere chiamato, perché il sistema operativo prima di distruggere altre attività / servizi.

Oltre a questo, è troppo tardi per acquisire il blocco scia nel metodo onCreate(). Prima viene raggiunto onCreate() il telefono potrebbe essere andato a dormire già quando si attiva il servizio da un vs. allarme da un'attività che è in background.

E 'difficile dire che cosa si dovrebbe fare in modo diverso, come non si danno molto ambito. Il corso abituale di eventi è questo. Un BroadcastReceiver viene chiamato e nel onReceive() si acquisire il blocco scia e metterlo in una variabile statica sul vostro servizio. Quando il servizio è fatto dovrebbe chiamare stopSelf(), rilasciare il blocco scia e poi null la variabile statica che mantiene un riferimento al blocco.

Inoltre, se si utilizza un servizio di un blocco completo scia è molto probabile che non ciò che si vuole, ma un blocco scia parziale. Non è necessario lo schermo di rimanere, giusto?

Siamo spiacenti, ma le serrature scia sono davvero complicati da usare, perché di esattamente i problemi che ho descritto sopra. E 'definitivamente un argomento avanzato ed è facile da rovinare. Se lo fai, la vostra applicazione sarà molto brutti commenti, perché tenendosi per troppo tempo è un grande reato drena la batteria. Non prendere nel modo sbagliato per favore, ma data la natura del problema che hai postato qui (/ errore del compilatore di sintassi) Vorrei suggerire di cercare una soluzione senza un servizio e scia di blocco.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top