2012-05-08 11 views
7

Me llamo al Alarm Manager para actualizar un widget con un Service. Tengo dos preguntas diferentes.¿Cómo usar Alarm Manager incluso si la aplicación está cerrada?

Primera pregunta: Llamaré al servicio con la intención de Alarm Manager. De esta manera:

alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
Intent i = new Intent(context, MyService.class); 
pi = PendingIntent.getService(context, 0, i, PendingIntent.FLAG_UPDATE_CURRENT); 

context.startService(new Intent(context, MyService.class)); 

Long repeat = Long.parseLong(prefs.getString("update_preference", "600")); 
alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, Calendar.getInstance().getTimeInMillis(), 1000*repeat, pi); 

¿Es incorrecto?

Se ve y funciona bien. Pero cuando he consultado los servicios de trabajo , no puedo ver mi nombre de servicio en la lista. Quizás no se esté ejecutando como un servicio único/separado. Acabo de ver el nombre de la aplicación (no como un servicio). No estoy seguro de cómo separar o importa?

Otra pregunta: durante mucho tiempo, la aplicación en ejecución, que controla la actualización de widgets, es cerrada de alguna manera (manualmente o por un asesino de tareas). Por supuesto, va a parar Alarm Manager y las funciones del widget también se detendrán. Por ejemplo, hacer clic en un botón.

Pero, Twitter resolvió este problema. Mientras el widget está activo, si cierro la aplicación principal (Twitter) -que controla el widget-, hago clic en el widget, de alguna manera se activa la aplicación y se inicia de nuevo. Entonces los botones funcionan correctamente. ¿Cómo es eso posible?

Cualquier ayuda sería apreciada.

Respuesta

3

No es necesario hacer context.startservice para saber cuál es el propósito pendiente, si desea que el servicio se ejecute de inmediato la primera vez que lo configuró para que se ejecute en ese momento, establezca el intervalo a partir de la hora actual.

También está configurando 2 tipos diferentes de repetición cuando no es necesario setRepeating es estricto donde setInexact no es y puede ser ajustado por el sistema operativo cuando se dispara, por lo tanto, es inexacto. Quieres uno o el otro no los dos.

También esos intervalos son muy pequeños y va a matar la batería de manera significativa.

Debe ser sólo este

alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
Intent i = new Intent(context, MyService.class); 
pi = PendingIntent.getService(context, 0, i, PendingIntent.FLAG_UPDATE_CURRENT); 

Long repeat = Long.parseLong(prefs.getString("update_preference", "600")); 
alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, 
         Calendar.getInstance().getTimeInMillis(), 1000*repeat, pi); 
+0

Lo siento por 2 repeticiones diferentes, he editado mi pregunta. –

+0

aún no necesita el 'context.startService' embargo, PendingIntent iniciará el servicio – tyczj

+0

En primer lugar, mi widget busca datos de cualquier servidor.¿Estás seguro de que usar el servicio es innecesario? ¿Debería usar la función de actualización en la clase de Widget? ¿Puedes dar un ejemplo para usar? Gracias. –

1

Es bueno que su aplicación/servicio no se esté ejecutando todo el tiempo. De hecho, no necesita/tiene que ejecutarse todo el tiempo para actualizar un widget. Si programa una intención con AlarmManager, la aplicación se iniciará cuando se active el intento si se ha cerrado.

+0

¡Gracias, idea clara. Gracias. Pero, ¿qué sucede si la aplicación que mantiene cerrado el administrador de alarmas como dije manualmente o por algún asesino? –

+0

AlarmManager no se está ejecutando dentro de su aplicación. No hay ningún problema si su aplicación se cancela porque será iniciada por el sistema operativo cuando se inicia el intento de servicio. – lujop

+0

De acuerdo, quiere decir que cuando el intervalo finalice, el servicio comenzará de nuevo. Pero aún así los eventos de clics no funcionan si la aplicación va. Es por eso que debería reiniciar el servicio al instante. Pero no sé cómo hacerlo. –

Cuestiones relacionadas