Создание сервиса android Python для выполнения в приостанавливает состояние

Вот является мой сценарий Python записанными сценариями андроида использования:

import android, time

droid = android.Android()
interval = 1 # every 1 minute

while True:
    # define your own vibrate pattern here
    droid.vibrate(200)
    time.sleep(0.3)
    droid.vibrate(300)

    time.sleep(60*interval)

Это в основном вибрирует каждую минуту (как фактор мотивации). Однако, когда телефон заблокирован с замененным пустым местом экраном, я не обнаруживаю вибрации. Возможно, Android замораживает сценарий (и следовательно цикл с условием продолжения)? Обратите внимание, что я действительно запускаю этот скрипт как услуга (длинное касание, и нажмите 'Start as service').

Существует ли способ заставить этот сценарий работать все время независимо от телефона, приостанавливают состояние?

Обновление 1: Я слышу вибрацию иногда, не каждую минуту.. а скорее как каждые 5-10 минут случайным образом.

Обновление 2: Это проблемы происходят, если я обычно запускаю скрипт (не как услуга). Кажется, что "time.sleep" не спит в течение требуемого времени.

15
задан Reinstate Monica 19 January 2010 в 01:45
поделиться

4 ответа

Возможное решение: Используйте некоторое программное обеспечение планировщика и регулярно начните свой скрипт. Таким образом, вам не нужно позвонить в Time.sleep ().

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

-2
ответ дан 1 December 2019 в 04:58
поделиться

Я не знаю много о привязке Python, поэтому я собираюсь ответить в качестве общей проблемы Android. См. Управление питанием .

partial_wake_lock Звучит интересно: «Rake Lock, который гарантирует, что CPU запущен. Экран может быть не включен».

Изучение пример блокировки разбойника

Все звонки по управлению питанием следуют то же Базовый формат:

  1. приобретайте ручку в PowerManager служба.
  2. Создайте разбойник и Укажите флаги управления питанием для Экран, время ожидания и т. Д.
  3. приобретают блокировку Wake.
  4. Выполнение операции (воспроизведение mp3, Откройте HTML-страницу и т. Д.).
  5. Отпустите блокировку Wake. Фрагмент ниже иллюстрирует этот процесс.
PowerManager pm = (PowerManager)mContext.getSystemService(
                                          Context.POWER_SERVICE);
PowerManager.WakeLock wl = pm.newWakeLock(
                                      PowerManager.SCREEN_DIM_WAKE_LOCK
                                      | PowerManager.ON_AFTER_RELEASE,
                                      TAG);
wl.acquire();
 // ...
wl.release();
-1
ответ дан 1 December 2019 в 04:58
поделиться

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

поэтому вы должны проверить значения уровня ошибок от самого высокого до самого низкого, потому что если уровень ошибок 1 тогда , если уровень ошибки 1 будет истинным, но , если уровень ошибки 0 , также будет истинным

setlocal
set /A sample =1 

:first
type C:\test.txt | find "inserted"

if errorlevel 1 goto exam
if errorlevel 0 goto test

:test
echo "testloop" >> C:\testloop.txt
set /A sample = %sample% + 1 

if %sample% LEQ 4 goto first

:exam
echo "exam loop" >> C:\examloop.txt

endlocal

, если включены расширения команд, и отсутствует переменная среды ERRORLEVEL (без учета регистра). Тогда теоретически можно использовать% ERRORLEVEL% как обычную переменную среды. Так что это также должно работать

setlocal EnableExtensions
set /A sample =1 

:first
type C:\test.txt | find "inserted"

if %errorlevel% EQU 1 goto exam
if %errorlevel% EQU 0 goto test

:test
echo "testloop" >> C:\testloop.txt
set /A sample = %sample% + 1 

if %sample% LEQ 4 goto first

:exam
echo "exam loop" >> C:\examloop.txt
-121--4349463-
>>> s = "0200A8C0"
>>> bytes = ["".join(x) for x in zip(*[iter(s)]*2)]
>>> bytes
['02', '00', 'A8', 'C0']
>>> bytes = [int(x, 16) for x in bytes]
>>> bytes
[2, 0, 168, 192]
>>> print ".".join(str(x) for x in reversed(bytes))
192.168.0.2

Это коротко и ясно; завершите его в функции с проверкой ошибок в соответствии с вашими потребностями.


Удобные функции группирования:

def group(iterable, n=2, missing=None, longest=True):
  """Group from a single iterable into groups of n.

  Derived from http://bugs.python.org/issue1643
  """
  if n < 1:
    raise ValueError("invalid n")
  args = (iter(iterable),) * n
  if longest:
    return itertools.izip_longest(*args, fillvalue=missing)
  else:
    return itertools.izip(*args)

def group_some(iterable, n=2):
  """Group from a single iterable into groups of at most n."""
  if n < 1:
    raise ValueError("invalid n")
  iterable = iter(iterable)
  while True:
    L = list(itertools.islice(iterable, n))
    if L:
      yield L
    else:
      break
-121--3434571-

Маловероятно, что это будет работать в ASE без поддержки AlertManager. Лучше всего подать запрос на функцию и дождаться его. Или, если вы чувствуете себя амбициозным, расширьте ASE самостоятельно и отправьте патч!

1
ответ дан 1 December 2019 в 04:58
поделиться

Среда сценариев определенно является гражданином второго сорта. То, что вам нужно, называется AlarmManager, использующий ELAPSED_REALTIME. Если это недоступно для среды сценариев, вы застряли.

Среда сценариев, по крайней мере, в настоящее время, не предназначена для полной замены среды набора средств разработки, в которой вы можете создавать полноценные приложения. Она предназначена для того, чтобы вы могли выполнять некоторые простые задачи, связанные со сценариями, за счет отсутствия возможности выполнять более сложные задачи. Извините.

10
ответ дан 1 December 2019 в 04:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: