Foros del Web » Programando para Internet » Android »

Temporizador en un servicio, imposible

Estas en el tema de Temporizador en un servicio, imposible en el foro de Android en Foros del Web. Buenos dias!, llevo semanas tirandome de los pelos y buscando por internet haber si encontraba solucion pero nada de lo probado ha funcionado, para ir ...
  #1 (permalink)  
Antiguo 09/01/2017, 03:15
 
Fecha de Ingreso: diciembre-2012
Mensajes: 15
Antigüedad: 4 años, 3 meses
Puntos: 0
Exclamación Temporizador en un servicio, imposible

Buenos dias!, llevo semanas tirandome de los pelos y buscando por internet haber si encontraba solucion pero nada de lo probado ha funcionado, para ir al grano, no consigo crear un temporizador dentro de un servicio, es decir, que se ejecute sin que haya ninguna activity de por medio, ya que si tengo la pantalla encendida en todo momento, si que funciona, pero si pulso el boton de encendido y apago la pantalla para dejar el movil encima de la mesa y esperar a que suene la alarma tras el temporizador, no suena en el momento correcto, ya que si por ejemplo le pongo 120segundos, puede sonar no pasado los 2 minutos, sino 10min.
Todo esto que comento es en la API23 en un dispositivo real, un HuaweiP9Lite, el mas actual que tengo.
Paso a comentar a continuacion lo que he ido haciendo haber si alguien me puede ayudar.
Lo primero que he hecho es una clase que extiende de service, y en onStartCommand lo tengo que devuelve un START_STICKY, de este modo cuando se cierra la activity desde la que se lanzo, el sistema vuelve a crear el servicio. Esta parte esta bien y funciona correctamente.
Ahora, dentro del codigo del servicio he probado de todo haber si el problema estaba en esta parte del codigo, he probado a crear un thread que se encarga del temporizador y ejecutarlo dentro del service, pero nada, tambien he probrado con un handler y un runnable, nada de nuevo, tambien probe con un timer y un timertask, siguio sin funcionar, tambien probe con una clase que encontre por casualidad "CountDownTimer" del api de android, de nuevo, nada.
Despues de todo eso, leyendo la documentacion de android y muchisimas paginas por internet, me encontre con la "ejecucion de servicios en primer plano" es decir, que el servicio llame a startForeground para dejarlo en ese primer plano, tampoco ha funcionado.
Segui mirando por interne y leyendo. Lo siguiente que me encontre fue los wake locks para bloquear a traves de un PARTIAL_WAKE_LOCK la cpu y que aunque se apagase la pantalla se siguiera ejecutando el servicio. Aun asi, esto tampoco funciona.
Despues he llegago a probar combinaciones de lo comentado, ahora mismo tal y como lo tengo es un "servicio en primer plano (foreground), que antes de empezar a ejecutar el temporizador adquiere un PARTIAL_WAKE_LOCK y lo libera una vez a terminado la cuenta atras" pero aun asi, no llega a funcionar como se espera.
¿Que puede estar pasando? Hasta donde llego yo, me he dado cuenta de las siguientes consideraciones, si ejecuto la aplicacion, y dejo la activity que lanza el servicio en primer plano, es decir, no la cierro, por mucho que apague la pantalla sigue funcionando y el temporizador hacer sonar la alarma al tiempo acordado, por lo que me surge una duda a este respecto, al hacer foreground el servicio realmente esto no esta funcionando, ya que precisamente, el hacerlo asi, significa que aunque cierre el activity, este cuando sea reconstruido quedara con su respectiva notificacion en la bandeja del sistema y en primer plano, ¿el fallo puede ser que hago mal esta parte?
Lo siguiente a considerar tambien es el wakelock, se supone que si adquiero un bloqueo de la cpu, aunque apague la pantalla, el sistema no será suspendido, pero a pesar de ello, intuyo, que lo que me esta pasando es precisamente esto, que el sistema entra en modo doze o app standby y me detiene la ejecucion del servicio.
Asi que mi gran duda es como consigo hacer el temporizador que se ejecute en un servicio y que el sistema hasta que no pare dicho temporizador no me detenga la ejecucion del mismo.

NOTA 1: He probado aplicaciones de temporizadores, alarmas y cronometros bajados del PlayStore y al menos, las que me he bajado, funcionan, las alarmas y los temporizadores suenan como deben. Comento esto aqui porque en un primer momento pense que era cosa de mi dispositivo, ya que hay gente que decia que la capa de personalizacion de Huawei, el EMUI, daba problemas, pero al parecer no, ya que hay otras aplicaciones que si que funcionan

NOTA 2: Antes de que me lo digan, comentar que utilizar el servicio de alarmas de android, es decir, crear un alarm a partir de un alarmManager no me fuciona, ya que precisamente, estoy haciendo esto para evitar que la impresicion de las alarmas que existe desde el api 19

NOTA 3: Me he dado cuenta de un detalle muy "loco", si cada segundo que pasa del temporizador, a parte del codigo que tengo que quiero que se ejecute, añado un beep, es decir:

Código:
ToneGenerator tg = new ToneGenerator(AudioManager.STREAM_NOTIFICATION, 100);
tg.startTone(ToneGenerator.TONE_PROP_BEEP);
Consigo el funcionamiento deseado, es decir, el servicio se ejecuta como debe aunque no exista ya la activity que lo lanzo, es como si el hecho de hacer sonar dicho beep aunque la pantalla este apagada impide que el telefono entre en modo descanso, pero claro, no creo que esto sea parte de la solucion, ya que seria bastante molesto el continuo beep, lo comento como algo que me he encontrado por casualidad y como una curiosidad

Muchas gracias a todos por vuestra ayuda.



La zona horaria es GMT -6. Ahora son las 07:23.