Hacer que un servicio de Android Python se ejecute en estado suspendido

Aquí está mi script de Python escrito usando androidscripting :

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) 

Básicamente vibra cada minuto (como un motivador ). Sin embargo, cuando el teléfono está bloqueado con la pantalla en blanco, no percibo ninguna vibración. Tal vez Android está congelando el script (y por lo tanto el bucle while)? Tenga en cuenta que, de hecho, estoy ejecutando este script como un servicio (mantenga pulsado y haga clic en ‘Iniciar como servicio’).

¿Hay alguna manera de hacer que este script funcione todo el tiempo, independientemente del estado de suspensión del teléfono?

Actualización 1 : escucho la vibración ocasionalmente, no cada minuto … sino como cada 5-10 minutos al azar.

Actualización 2 : este problema ocurre si ejecuto el script normalmente (no como un servicio). Parece que “time.sleep” no está durmiendo durante el tiempo especificado.

El entorno de scripting es definitivamente un ciudadano de segunda clase. Lo que quieres se llama AlarmManager, usando ELAPSED_REALTIME. Si eso no está disponible para el entorno de scripting, estás atascado.

El entorno de scripting no pretende, al menos en la actualidad, ser un reemplazo completo del entorno del kit de desarrollo, donde puede crear aplicaciones completas. Está pensado para permitirle realizar algunas tareas de scripting simples, a costa de no poder hacer cosas más complicadas. Lo siento.

Estoy enfrentando el mismo tipo de problema.

time.sleep () no es confiable cuando su dispositivo Android está en modo “bloqueado”:

Aquí hay algunas cosas que he probado en SL4A release4 + pythonForAndroid_r5 + android 2.3.3 en samsung galaxy S

  • envuelva un bucle time.sleep (intervalo) dentro de droid.wakeLockAcquirePartial () y droid.wakeLockRelease (). Esto evitará que la CPU se ralentice.
  • use una llamada eventWaitFor (eventName, timeOutInMilliSeconds):

droid.eventWaitFor (“ThisEventCannotHappen”, intervalo * 60000)

  • El objeto de threading.Timer () también funciona como se esperaba, después de algunas pruebas en mi dispositivo (se necesita confirmación …)

No estoy seguro, pero es mejor que tengas en cuenta que estos trucos pueden consumir más energía de la esperada en el modo verdadero “bloqueado / inactivo” y, por lo tanto, reducir el tiempo de ejecución de tu dispositivo.

Actualización: eventWaitFor () tampoco es confiable para intervalos largos. Aquí hay un fragmento que muestra cómo funciona 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) 

Es poco probable que esto funcione en ASE sin soporte para AlertManager. Su mejor apuesta es presentar una solicitud de función y esperar por eso. O, si se siente ambicioso, ¡extienda ASE usted mismo y envíe un parche!

No sé mucho sobre el enlace de Python, así que voy a responder como un problema general de Android. Ver gestión de energía .

PARTIAL_WAKE_LOCK suena interesante: “Activar locking que garantiza que la CPU se está ejecutando. Es posible que la pantalla no esté encendida”.

Explorando un ejemplo de Wake Lock

Todas las llamadas de administración de energía siguen el mismo formato básico:

  1. Adquirir asa al servicio de PowerManager.
  2. Cree un locking de activación y especifique los indicadores de administración de energía para la pantalla, el tiempo de espera, etc.
  3. Adquirir locking de vigilia.
  4. Realizar la operación (reproducir MP3, abrir página HTML, etc.).
  5. Liberar locking de estela. El siguiente fragmento ilustra este proceso.
 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(); 

Posible solución: use algún software de progtwigción e inicie su script regularmente. De esta manera no necesitarás llamar a time.sleep ().

Tal vez el scripting no sea la mejor solución para tales tareas periódicas. No enfrentarás este problema si escribes una aplicación Java simple.