Использование wakelock в сервисе Android 1.5 - PullRequest
6 голосов
/ 14 июня 2009

Здравствуйте. Я пытаюсь использовать службу для управления 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 ]

9 голосов
/ 15 июня 2009

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

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

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

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

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

5 голосов
/ 14 июня 2009

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

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

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

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

...