Использование wakelock в сервисе Android 1.5

Здравствуйте, я пытаюсь использовать службу для управления wakelock, чтобы я мог постоянно оставлять экран включенным, когда мое приложение работает. Я создаю wakelock и активирую его в onCreate() и освобождаю его в onDestroy(), однако я получаю ошибку "wl не может быть решена". Может кто-нибудь объяснить, как я могу преодолеть это? Код ниже:

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

2 ответа

Решение

Вы не пропустили черту?

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

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

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

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

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

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

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

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

Другие вопросы по тегам