5

Здравствуйте, я пытаюсь использовать службу для управления wakelock, чтобы я мог навсегда покинуть экран, когда мое приложение запущено. Я создаю wakelock и активирую его в onCreate() и освобождаю его в onDestroy(), но я получаю ошибку «wl не может быть разрешен». Может кто-нибудь объяснить, как я могу это преодолеть? Код ниже:Использование wakelock в сервисе 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(); 
    } 
} 

ответ

5

Вы не пропуская линию

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

в OnDestroy()? Это локальная переменная в onCreate(), но она вообще не объявлена ​​в onDestroy().

Или, что более вероятно, вы можете сделать это поле класса WakeLockService вместо локальной переменной.

9

Ну, даже если вы будете использовать переменную экземпляра, я думаю, что это не способ сделать это. Кто звонит destroy()? Я надеюсь, что не вы, это работа ОС. Но когда вы держите блокировку следа, маловероятно, что ваш метод destroy() будет вызван, потому что ОС сначала уничтожит другие действия/службы.

Кроме того, это слишком поздно, чтобы приобрести блокировку следа в методе onCreate(). До того, как достигнут onCreate(), телефон, возможно, уже заснул, когда вы запускаете Службу из сигнала тревоги по сравнению с активностью, которая находится в фоновом режиме.

Трудно сказать, что вы должны делать по-другому, поскольку вы не придаете большого значения контексту. Обычный ход событий. A BroadcastReceiver вызывается и в onReceive() вы получаете блокировку следа и ставите ее в статическую переменную на свой сервис. Когда услуга завершена, он должен позвонить stopSelf(), отпустить блокировку слежения и затем сбросить статическую переменную, содержащую ссылку на блокировку.

Кроме того, если вы пользуетесь Службой, полная блокировка бодрствования, скорее всего, не то, что вы хотите, а частичный замок слежения. Вам не нужен экран, чтобы оставаться включенным, верно?

Извините, но блокировки волка действительно сложны в использовании, из-за проблем, описанных выше. Это определенно продвинутая тема, и ее легко ввернуть. Если вы это сделаете, ваше приложение получит очень уродливые комментарии, потому что слишком долго удерживать его - это серьезное нарушение, так как оно истощает батарею. Не принимайте это неправильно, но, учитывая характер проблемы, которую вы разместили здесь (ошибка синтаксиса/компилятора), я настоятельно рекомендую искать решение без блокировки службы и бодрствования.

+0

Спасибо за комментарий. В приложении, над которым я работаю, мне нужно, чтобы телефон находился в режиме 100% бодрствования, поэтому я использовал полную блокировку слежения. – Tom

+0

Частичный wakelock должен быть достаточным для включения процессора и использования сети. – Eno

+0

Спасибо тоже. Ваше объяснение кратким и более полезным, чем вопрос и ответ вместе :) – Melllvar

 Смежные вопросы

  • Нет связанных вопросов^_^