|
||
|
|
|
|||||||
| Avisos |
| Programación y Desarrollo para Android Subforo exclusivo para temas de programación de software para PDAs y desarrollo de aplicaciones, interfaces, etc bajo Android |
![]() |
|
|
Herramientas |
|
#1
|
||||
|
||||
|
Servicios y tareas en segundo plano.
Hola a todos:
Estoy haciendo una aplicación con alarmas, en un principio estas no sonaban si eran programadas para dentro de mas de media hora. Busque información y encontré que para que funcionara en segundo plano de forma indefinida debía crear un servicio, lo cree y ahora cuando cierro la aplicación, incluso cuando la cierro con el menú que sale con la presión prolongada sobre la casita, y la vuelvo a abrir la aplicación sigue funcionando como debería. El problema es que cuando programo una alarma para dentro de 7 horas, osea para dentro de mucho tiempo, no llegan a sonar y efectivamente cuando abro la aplicación veo que ya no funciona a pesar de que si miro en el administrador de tareas la aplicación se seguía ejecutando. ¿Alguien tiene alguna idea de que debo hacer? Estoy desesperado. Muchas gracias. Última edición por daniel_gs Día 22/08/13 a las 18:48:29. |
|
|
|
#3
|
||||
|
||||
|
no uso alarmmanager lo hago con un handler, donde deberia poner el PendingIntent, podriais poner un ejemplo.
My codigo es tal que asi: Codigo del servicio: Cita:@Override
public int onStartCommand(Intent intenc, int flags, int idArranque) { Runnable r = new RingRing(time, mp, v); new Thread(r).start(); return START_STICKY; } ![]() Cita:public class RingRing implements Runnable {
private Handler hCd = new Handler(); private long time; private MediaPlayer mp; private Vibrator v; public RingRing(long time, MediaPlayer mp, Vibrator v) { this.time = time; this.mp = mp; this.v = v; } public void run() { System.out.println("RingRing: " + time); hCd.removeCallbacks(hCdHand); hCd.postDelayed(hCdHand, time); } private Runnable hCdHand = new Runnable() { public void run() { if (!mp.isPlaying()){ mp.start(); v.vibrate(mp.getDuration()); } } }; } ![]() |
|
#4
|
||||
|
||||
|
Un Handler se ejecuta dentro de la propia aplicación, si el contexto de la aplicación deja de existir (porque Android lo elimina de memoria) ya no se ejecuta.
Ejemplo con AlarmManager: Intent intent = new Intent(this, ACTIVITY_QUE_QUIERES_EJECUTAR.class); PendingIntent pi=PendingIntent.getBroadcast(this, 0, intent, 0); AlarmManager am=(AlarmManager) getSystemService(Context.ALARM_SERVICE); am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+TIEMPO, pi); Cosas del código: - ACTIVITY_QUE_QUIERES_EJECUTAR: Es obvio - TIEMPO: Número de milisegundos desde el momento actual en el que quieres que se lance la activity. - AlarmManager.RTC_WAKEUP: Esto significa que la Activity se ejecutará aunque el móvil esté en modo Sleep. El móvil se despertará para ejecutarla. En su lugar puedes usar AlarmManager.RTC, que lo que hace es que sólo se ejecutará si el móvil está despierto, en el caso de estar durmiendo se ejecutará la próxima vez que el móvil se despierte. |
|
#5
|
||||
|
||||
|
¿pero no se supone que el servicio no deja de existir asta que lo paras?
El servicio que hago tiene dos funciones, la de poner la alarma en marcha y la de guardar las variables para iniciar la aplicacion cuando esta se elimina. Y no hace ninguna de las dos si pasa mucho tiempo. ¿Y si en un futuro no quisiera iniciar una alarma tras x segundos si no una serie de metodos? |
|
#6
|
||||
|
||||
|
Yo uso servicio, y si... , se ejecuta aunque la aplicación no este activa , pero en tu código no veo la clase Service por ningún sitio, es un handler como dice kriogeN.
|
|
#7
|
||||
|
||||
|
Yo uso servicio, y si... , se ejecuta aunque la aplicación no este activa , pero en tu código no veo la clase Service por ningún sitio, es un handler como dice kriogeN.
![]() |
|
#8
|
||||
|
||||
|
No se donde leí que los servicios actúan en nombre de la Activity que los llamó. Así que de ser cierto estarías añadiendo el Handler a la cola de mensajes de la Activity, que fijo que en 7 horas va a estar destruidísima, y por tanto la cola de mensajes se vacía y no se ejecuta.
De todas formas estás haciendo un mal uso de servicios, no están pensados para lo que tú quieres hacer, para eso precisamente existe el AlarmManager. |
|
#9
|
||||
|
||||
|
Bueno al final lo solucioné.
Basta con hacer que el servicio habra un hilo y este compruebe mediante un bucle cuanto tiempo lleva funcionando desde que se inicio el bucle. De esta forma el servicio no termina hasta que no termina el bucle, usando el handler el servicio termina cuando deja de hacer cosas despues de un rato, aunque haya programado un handler. Muchas gracias a todos. |
|
#10
|
||||
|
||||
|
Eso es una máquina de chupar batería que da gusto, no se porque te complicas la vida con eso cuando Android te da herramientas específicas para lo que quieres hacer.
Es como querer comunicarte con un servidor web y en vez de usar un HttpClient crear un Socket y mandar los paquetes HTTP a pelo. |
|
#11
|
||||
|
||||
|
jejeje porque usando AlarmManager solo puedo poner alarmas y de mi forma puedo implementar que se ejecute un metodo cuando quiera.
¿De todas maneras hay alguna forma de ver el codigo fuente de la clase AlarmManager? |
![]() |
Estás aquí
|
||||||
|
||||||
| Herramientas | |