Вопрос

Здравствуйте, я пытаюсь использовать службу для управления блокировкой пробуждения, чтобы я мог постоянно оставлять экран включенным, когда мое приложение работает.Я создаю блокировку пробуждения, активирую ее в 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();
    }
}
Это было полезно?

Решение

Разве ты не пропустил строку?

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

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

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

Другие советы

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top