2010-11-09 15 views
7

Tengo una aplicación que inicia un servicio. El servicio tiene un temporizador y muestra una notificación cada 30 segundos. Me he dado cuenta el siguiente comportamiento:El servicio Android deja de funcionar cuando el teléfono está bloqueado

  • si la pantalla está en las notificaciones se muestran bien (incluso si la aplicación está en segundo plano)
  • si la pantalla está apagada (con el botón de alimentación o por sí mismo) las notificaciones ganaron 't mostrar
  • si la pantalla está apagada, pero tengo la depuración corriendo las notificaciones aparecen

¿Cómo puedo hacer que el servicio que se ejecuta con la pantalla apagada.

(La aplicación real sólo comprueba si la notificación se debe comprobar cada 30 segundos, pero para los propósitos de prueba, el escenario anterior es aceptable)

Gracias!

Respuesta

2

No es así. Esa sería la forma perfecta de drenar rápidamente la batería del teléfono. Si el teléfono está en reposo, déjalo dormir, a menos que tengas una BUENA razón para no hacerlo (en cuyo caso utilizarás el AlarmManager para una llamada de atención por única vez en el futuro).

No sé lo que está tratando de lograr, pero debe usar un enfoque completamente diferente. Un truco en la red sería una buena idea, por ejemplo, suponiendo que puedes vivir con tu aplicación siendo 2.2+ solamente.

+0

@EdoMike Estoy usando un código como este Contexto c = getApplicationContext(); alarmManager alarm = (AlarmManager) c.getSystemService (Context.ALARM_SERVICE); Intención i = nueva intención (c, AlarmProxy.class); PendingIntent sender = PendingIntent.getBroadcast (c, 0, i, PendingIntent.FLAG_CANCEL_CURRENT); alarma. setRepeating (AlarmManager.ELAPSED_REALTIME_WAKEUP, 0, 10000, remitente); registerReceiver (alarmBroadcast, nuevo IntentFilter (Intent.ACTION_TIME_TICK)); pero el temporizador no se llama cada 10 segundos, ¿cómo puedo hacer eso? –

1

Si realmente quiere que su servicio para ejecutar cada 30s cuando el dispositivo está bloqueado, tiene que programar la alarma con el tipo ELAPSED_REALTIME_WAKEUP. Pero ten cuidado, esto seguramente va a agotar rápidamente las baterías de los dispositivos.

4

Tuve un problema.

¡Puede usar el WakeLock para hacer el trabajo! Algo como esto:

PowerManager pm = (PowerManager)getApplicationContext().getSystemService(
      getApplicationContext().POWER_SERVICE); 
WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG); 
wl.acquire(); 

A continuación, utilice la siguiente:

wl.release(); 

para liberar el wakelock.

No falsificador añadir:

<uses-permission android:name="android.permission.WAKE_LOCK" />

al manifiesto!

+2

no lo use, ya que va a agotar la batería inútilmente. En su lugar use el AlarmManager como se indica en otra respuesta – Marius

+0

@Marius ¿Podemos usar AlarmManager para despertar cada 30 segundos? –

+1

sí, simplemente configure PendingIntent para (por ejemplo) iniciar un servicio, y luego haga que el AlarmManager repita cada 30 segundos. – Marius

Cuestiones relacionadas