Сервис, WakeLock

Я немного запутался после того, как рассмотрел вопросы и ответы в Stackoverflow о WakefulIntentService. Я просто хотел бы получить некоторые знания по этим темам, чтобы убедиться, что я правильно понимаю, пожалуйста, не стесняйтесь поправлять меня, если я ошибаюсь.

Я создал небольшое приложение, в котором я использую фон Service, который воспроизводит музыку всякий раз, когда пользователь встряхивает мобильник. Я тестировал после того, как устройство заблокировано и экран выключен, и он работает должным образом.

  1. Что я слышу от этого форума, служба может отключиться как скоро устройство перейдет в спящий режим. Это правда? В моем случае это работает всегда, я что-то упускаю?

  2. Зачем нужен WakeFulIntentService? Когда нам нужно использовать WakefulIntentService?

  3. Я пробовал запустить таймер в Service, хотя устройство заблокировано, экран выключен, а мой таймер работает, я могу сказать наверняка. Потому что раньше я получал уведомление всякий раз, когда срабатывал таймер.


person Ramesh Sangili    schedule 02.01.2013    source источник


Ответы (2)


На этом форуме я слышу, что служба может отключиться, как только устройство перейдет в спящий режим. Это правда?

да.

В моем случае работает всегда

Тогда что-то еще на вашем устройстве не дает устройству заснуть. Возможно, используйте adb shell dumpsys power, чтобы увидеть, какие WakeLocks выдающиеся.

Зачем нужен сервис WakeFulIntent? Когда нам нужно использовать WakefulIntentService?

Устройство может заснуть, если пользователь неактивен и ничто не мешает ему спать. WakeLock используется, чтобы гарантировать, что устройство не спит. Для работы, связанной с транзакциями (например, загрузка файла), WakefulIntentService объединяет IntentService и WakeLock, чтобы относительно легко держать устройство в активном состоянии столько, сколько необходимо (и только до тех пор, пока это необходимо).

WakefulIntentService не подходит для использования со службами, которые должны работать бесконечно, например с музыкальным проигрывателем. Для тех, управляйте своими собственными WakeLock.

person CommonsWare    schedule 02.01.2013
comment
Я создаю поток в своей службе, чтобы мой таймер всегда работал. Я планирую таймер внутри метода запуска потока? Является ли это причиной того, что таймер работает, хотя устройство заблокировано. Я тестировал на двух разных устройствах, и все работало нормально. Насколько я понимаю, IntentService будет убит после завершения выполнения. Я хочу, чтобы процесс всегда работал в фоновом режиме, чтобы отслеживать действия пользователя, всякий раз, когда пользователь встряхивает мобильный телефон, мне нужно предупреждать пользователей на основе критериев. Я считаю, что устройство переходит в спящий режим, как только я блокирую устройство и экран выключается. - person Ramesh Sangili; 03.01.2013
comment
@Ramesh: я хочу, чтобы процесс всегда работал в фоновом режиме, чтобы отслеживать действия пользователя, всякий раз, когда пользователь встряхивает мобильный телефон, мне нужно предупреждать пользователей на основе критериев - для этого вам потребуется постоянно получать WakeLock, с соответствующим вредом для срока службы батареи пользователя. Ваши пользователи будут вознаграждать вас низкими оценками в Play Store. - person CommonsWare; 03.01.2013
comment
Извините за ошибку, как gmail, facebook, linkedin автоматически синхронизируют почту или обновления каждые x минут? они тоже используют WakeLock? или у нас есть что-то еще, что эффективно запускает процесс вечно? - person Ramesh Sangili; 03.01.2013
comment
@Ramesh: как gmail, facebook, linkedin автоматически синхронизируют почту или обновления каждые x минут? - некоторые могут использовать службу с AlarmManager, некоторые могут реализовывать SyncAdapter. они тоже используют WakeLock? - конечно, служебные. Я еще не играл с SyncAdapter, но надеюсь, что Android управляет WakeLock за вас в этом сценарии. - person CommonsWare; 03.01.2013

Я использовал приведенный ниже код в приложении.

Убедитесь, что ваш сервис липкий:

@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
    //this service will run until we stop it

    return START_STICKY;
}

Если вы хотите, чтобы ваш телефон постоянно не спал, вы можете использовать следующий код:

private WakeLock wl;

PowerManager pm = (PowerManager)getSystemService(Context.POWER_SERVICE);
    wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "whatever");
    wl.acquire();

Не забывайте разрешения в вашем манифесте.

<uses-permission android:name="android.permission.WAKE_LOCK" />
person Jasper Fioole    schedule 02.01.2013
comment
В какие функции сервиса вы рекомендуете ставить вызовы эквайера и деблокирования? А что, если это IntentService? - person android developer; 05.06.2014
comment
приобретать в oncreate () и выпускать в destroy () - person Ritzor; 08.09.2019
comment
FULL_WAKE_LOCK устарел в API lvl 17 - person Tamim Attafi; 03.01.2020