2012-02-03 8 views
5

Deseo enviar datos al servidor en un intervalo de regular. Entonces, estoy usando AlarmManager para lo mismo. Funciona bien, pero el problema es que cuando I cancel cambian la alarma en Date/Time. En ese momento, la alarma se dispara nuevamente antes de cancelarse, por lo que empeora mi aplicación ya que se envía un extra a server con irregular intervalo.Error de AlarmManager al restablecer/cancelar la alarma en el cambio de fecha y hora

Aquí está mi clase BroadCastReceiver con AlarmManager.

public class MyReceiver extends BroadcastReceiver{ 

    AlarmManager mgr; 
    PendingIntent pi; 
    Intent intent; 
    public static boolean flag = false; 

    @Override 
    public void onReceive(final Context arg0, Intent arg1) { 

     if(arg1.getAction().equals("android.intent.action.TIME_SET")){ 
      Log.d("MyReceiver", "Time set"); 

      mgr = (AlarmManager) arg0.getSystemService(Context.ALARM_SERVICE); 
      intent = new Intent(arg0, TestService.class); 
      intent.putExtra("test", "testvalue"); 
      pi = PendingIntent.getService(arg0, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 

      if(!flag){ 
       mgr.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 10000, 5000, pi); 
       flag = true; 
      } 
      else{ 
       mgr.cancel(pi); 
       pi.cancel(); 
       flag = false; 
      } 
     } 
    } 
} 

A continuación se muestra la captura de pantalla con la salida Logcat que explica que después de la cancelación de la alarma se dispara una vez más tiempo justo después de la cancelación.

enter image description here

Como se puede ver en la salida de Logcatblack arrow muestra donde he cambiado ese momento para cancelar la alarma y red arrow muestra que después de la cancelación de la alarma una vez que disparó justo antes de la cancelación que no debería suceder. Entonces, ¿alguien puede dar mi idea de por qué está sucediendo eso y qué debo hacer para que restrict se active de nuevo la alarma antes de cancelarla?

NOTA: - Esto solo ocurre cuando intento aumentar la fecha/hora, por ejemplo, de 10:00 a 11:00, funciona perfecto cuando disminuyo el tiempo, por ejemplo, de 10:00 a 9:00.

Respuesta

0

No puedo ver el LogCat en mi extremo, pero al mirar el código, no estoy seguro, ¿cómo es que el Servicio que se invoca (TestService) es asesinado/detenido? Creo que tendrías que detenerlo de alguna manera. Además, no se recomienda realizar tareas de larga ejecución dentro del receptor de difusión. ¿Ha verificado que el evento de detención de servicio se produce después de que se dispara el mgr.cancel (pi)?

+0

No estoy deteniendo el servicio. Estoy restableciendo la alarma. –

+0

Intente detener el servicio también, supongo ... Bcos puede haber posibilidades de que el servicio todavía esté haciendo su trabajo mientras se cancela el administrador de alarmas. –

+0

No creo que sea el caso, porque como dije, solo sucede cuando estoy aumentando el tiempo y funciona bien cuando disminuyo el tiempo. –

0

Simplemente intente con algún código único con intención pendiente dentro de la actividad y luego cancele ese intento con el mismo código.

ajuste intención pendiente en actividad

PendingIntent.getBroadcast (esto, código, la intención, PendingIntent.FLAG_UPDATE_CURRENT);

para detener que receptor de radiodifusión

PendingIntent pendingIntent = PendingIntent.getBroadcast (getBaseContext(), código, la intención, 0); AlarmManager alarmManager = (AlarmManager) getSystemService (Context.ALARM_SERVICE); alarmManager.cancel (pendingIntent);

+0

Intentó no ayudó. –

+0

¿Cuál es el estado ahora al usar este código? – Pratheeja

+0

igual que sucedía –

0

razón por la que está pasando

primero de todo es que está utilizando Acción Intención android.intent.action.TIME_SET por lo que quiere decir que Cada vez cualquier forma si la fecha/hora del sistema se cambia su BroadcastReceiver será ne llamada automáticamente .

En segundo lugar has usado un static boolean flag en tu clase Receiver. Ahora lo que está sucediendo es Siempre que cambie las sincronizaciones del sistema, la bandera cambia su estado de false to true y de true to false.

Eso es exactamente lo que sucede en el código y logcat también muestra lo mismo que todo está funcionando según el código escrito.

Así que, según yo, hay nada Error al pasar en el código y su salida.

what should I do to restrict Alarm getting fired again before cancelling 

La primera cosa que yo creo, que no deben usar Acción TIME_SET como esa para cambiar la bandera de encendido/apagado como usuarios y desarrolladores puede que no recuerde por lo que son tiempo de cambio, ya sea a su vez de la bandera en o Desactivado,

mejor manera es que, que debe manejar el servicio a sí mismo por una actividad y mostrar una ToggleButton allí para gestionar el estado de la marca y establecer y cancelar la PendingIntent.

O Y Si usted quiere hacer la tarea de su servicio de manera automática, el que simplemente utiliza el AlarmManager y establecer su tiempo de disparo de alarma e Intervalo allí sólo una vez decir que el tiempo es CurrentTime y del intervalo es 50000 milisegundos. .

por lo que, obviamente, llamará al servicio de ahora en adelante después de cada 5 minutos, a continuación, en su aplicación sólo se requiere una ToggelButton a indciate la sincronización para Ther servidor está encendido o apagado, si el usuario Activar o desactivar luego escriba su código AlarmManager allí en su Actividad solo en el toggleButtontb.setOnCheckedChangeListener(listener), supongo esta es la mejor manera entonces lo que realmente está implementando.

+0

No puedo usar ToggleButton ya que no tengo ninguna GUI en mi aplicación. También quiero utilizar 'TIME_SET' obligatorio y disparar un código en el cambio de hora. –

-1

No entiendo lo que necesita configurar el receptor para el cambio de fecha si su objetivo es solo enviar los datos en el servidor en un intervalo regular.

cambiar la fecha y la hora del dispositivo no significa que su alarma no funcionará en ese momento que ya ha configurado antes de esos cambios. Alarmmanager trabajan en ese período de tiempo dado que excluye de la fecha y hora local actual del dispositivo.

+0

Considero desde la perspectiva del usuario que si el usuario cambia la fecha y la hora. –

+0

si el usuario lo cambia aunque la alarma configurada no se cancele, permanece como está – dhams

+0

Sé que no se cancelará, pero el problema es que cuando el usuario cambia la fecha y hora, el servicio se llama multiples veces por primera vez. –

Cuestiones relacionadas