5

Witam Próbuję użyć usługi do kontroli wakelock, dzięki czemu mogę na stałe pozostawić ekran, gdy moja aplikacja jest uruchomiona. Tworzę wakelock i aktywuję go w onCreate() i zwalniam go w onDestroy() jednak pojawia się błąd "wl nie może być rozwiązany". Czy ktoś może wyjaśnić, jak mogę to zmienić? Kod poniżej:Korzystanie z usługi wakelock w usłudze Android 1.5

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(); 
    } 
} 

Odpowiedz

5

nie Brakuje Ci linię

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

w onDestroy()? Jest zmienną lokalną w onCreate(), ale w ogóle nie jest zadeklarowana w onDestroy().

Lub, bardziej prawdopodobne, możesz uczynić z niej pole klasy WakeLockService zamiast zmiennej lokalnej.

9

Cóż, nawet jeśli użyjesz zmiennej instancji, myślę, że to nie jest sposób na zrobienie tego. Kto zadzwoni pod numer destroy()? Mam nadzieję, że nie, to zadanie dla systemu operacyjnego. Ale gdy trzymasz blokadę wybudzającą, jest mało prawdopodobne, że twoja metoda destroy() zostanie wywołana, ponieważ system operacyjny najpierw zniszczy inne czynności/usługi.

Poza tym jest zbyt późno, aby uzyskać blokadę wybudzania w metodzie onCreate(). Przed osiągnięciem onCreate() telefon może już zasnąć, gdy uruchomisz usługę z alarmu lub z działania, które jest w tle.

Trudno powiedzieć, co należy zrobić inaczej, ponieważ nie podaje się zbyt wiele kontekstu. Zwykły tok wydarzeń. A BroadcastReceiver zostaje wywołana, aw onReceive() uzyskujesz blokadę wybudzania i umieszczasz ją w zmiennej statycznej w usłudze. Po wykonaniu usługi należy wywołać stopSelf(), zwolnić blokadę wybudzania, a następnie usunąć zmienną statyczną, która zachowuje odwołanie do blokady.

Ponadto, jeśli korzystasz z usługi, pełna blokada wybudzenia prawdopodobnie nie jest tym, czego potrzebujesz, ale jest częściowa blokada wybudzania. Nie potrzebujesz ekranu, by pozostać włączony, prawda?

Przepraszam, ale blokady wybudzenia są naprawdę skomplikowane w użyciu, z powodu dokładnie problemów opisanych powyżej. Jest to zdecydowanie zaawansowany temat i łatwo go zepsuć. Jeśli to zrobisz, Twoja aplikacja otrzyma bardzo brzydkie komentarze, ponieważ zbyt długie trzymanie się jest poważnym przestępstwem, ponieważ powoduje wyczerpanie baterii. Nie bierz tego w niewłaściwy sposób, ale biorąc pod uwagę naturę problemu, który tu zamieściłeś (błąd składni/kompilatora), zdecydowanie zalecamy wyszukanie rozwiązania bez usługi i blokady wybudzania.

+0

Dzięki za komentarz. W aplikacji, nad którą pracuję, potrzebuję, aby telefon był w trybie czuwania w 100%, dlatego użyłem pełnej blokady wybudzania. – Tom

+0

Częściowy wakelock powinien wystarczyć do zasilenia procesora i korzystania z sieci. – Eno

+0

Dziękuję również ode mnie. Twoje wyjaśnienie jest zwięzłe i bardziej pomocne niż pytanie i odpowiedź w połączeniu :) – Melllvar