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

Вот мой скрипт Python, написанный с использованием скриптов android :

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 замораживает скрипт (и, следовательно, цикл while)? Обратите внимание, что я действительно запускаю этот скрипт в качестве службы (нажмите и нажмите «Начать как сервис»).

Есть ли способ заставить этот скрипт работать все время независимо от состояния приостановки телефона?

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

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

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

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

    Я столкнулся с такой же проблемой.

    Time.sleep () не является надежным, когда ваше устройство Android находится в «заблокированном» режиме:

    Вот несколько вещей, которые я пробовал на SL4A release4 + pythonForAndroid_r5 + android 2.3.3 на samsung galaxy S

    • Заверните цикл time.sleep (interval) внутри droid.wakeLockAcquirePartial () и droid.wakeLockRelease (). Это предотвратит замедление CPU.
    • Используйте eventWaitFor (eventName, timeOutInMilliSeconds):

    Droid.eventWaitFor («ThisEventCannotHappen», интервал * 60000)

    • Threading.Timer (), похоже, работает так, как ожидалось, после нескольких тестов на моем устройстве (подтверждение необходимо …)

    Я не уверен, но вам стоит помнить, что эти трюки могут истощить больше энергии, чем ожидалось, в реальном режиме «блокировки / спящего режима» и, следовательно, сократить время работы вашего устройства.

    Обновление: eventWaitFor () не является надежным ни для длинных интервалов. Вот фрагмент, показывающий, как работает Timer ():

     import android import threading import logging def doStuff(): logging.info("testTimer.py: Stuff DONE") droid.notify('testTimer.py',"doStuff() has been called") droid.vibrate(500) def createLog(path): logging.basicConfig(filename=path, level=logging.INFO, format='%(asctime)s %(message)s') DELAY=600 droid=android.Android() logpath="/mnt/sdcard/testTimer.py.log" createLog(logpath) timer=threading.Timer(DELAY,doStuff) logging.info("timer starting now") timer.start() logging.info("doStuff() will be called by timer...Delay=%d" % DELAY) 

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

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

    PARTIAL_WAKE_LOCK звучит интересно: «Блокировка от PARTIAL_WAKE_LOCK , гарантирующая, что процессор работает. Возможно, экран не PARTIAL_WAKE_LOCK ».

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

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

    1. Приобретите ручку службы PowerManager.
    2. Создайте блокировку слежения и укажите флаги управления питанием для экрана, тайм-аута и т. Д.
    3. Приобретите блокировку слежения.
    4. Выполните операцию (воспроизведите MP3, откройте HTML-страницу и т. Д.).
    5. Заблокировать замок. Ниже приведен фрагмент ниже этого процесса.
     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(); 

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

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