studio notificaciones mensajes google gcm estado barra android android-listview android-activity google-cloud-messaging

android - notificaciones - Actividad refrescante al recibir la notificación de inserción gcm



notificaciones push php mysql (7)

La respuesta de aceptación es, de hecho, correcta para la "Actividad de actualización al recibir la notificación de inserción de gcm" (también la he modificado). Pero si solo desea actualizar un ListView que se muestra, no necesita un receptor de transmisión.

Su servicio de escucha GCM puede actualizar la base de datos utilizando ContentProvider en lugar de insertar una consulta SQL directa.

Luego puede confiar en el método notifyChange en ContentResolver para hacer el truco.

Notificar a los observadores registrados que se actualizó una fila. Para registrarse, llame a registerContentObserver (). Por defecto, los objetos CursorAdapter recibirán esta notificación. Si syncToNetwork es verdadero, intentará programar una sincronización local utilizando el adaptador de sincronización que está registrado para la autoridad del uri proporcionado. No se pasará ninguna cuenta al adaptador de sincronización, por lo que todas las cuentas coincidentes se sincronizarán.

Cómo actualizar la actividad al recibir la notificación push gcm si mi aplicación está abierta . Tengo una actividad que contiene una vista de lista llena de datos del servidor. Deseo actualizar mi actividad ( agregando aquí un elemento más a la vista de lista ), si recibo una notificación de inserción gcm (que también contiene algunos datos).

  • Una alternativa es agregar un temporizador que periódicamente haga solicitudes al servidor y actualice los datos del adaptador de lista, pero no los quiero porque requerirá muchos recursos.
  • ¿Debo agregar el receptor de difusión que se activará al recibir gcm push, que solicitará datos del servidor más nuevos y actualizará mi IU de actividad?

Estimados comentaristas, por favor, lea la pregunta con cuidado, solo necesito actualizar la lista (si la aplicación está abierta y esa actividad en particular está abierta) de lo contrario no es necesario .


Me tomó unas horas averiguarlo. Publicando aquí en caso de que alguien más tenga el mismo problema.

La idea es que debe registrar su actividad como receptor de difusión. La forma más fácil de hacer esto es así:

//register your activity onResume() @Override public void onResume() { super.onResume(); context.registerReceiver(mMessageReceiver, new IntentFilter("unique_name")); } //Must unregister onPause() @Override protected void onPause() { super.onPause(); context.unregisterReceiver(mMessageReceiver); } //This is the handler that will manager to process the broadcast intent private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { // Extract data included in the Intent String message = intent.getStringExtra("message"); //do other stuff here } };

El código anterior va en la actividad que desea ''escuchar'' para eventos.

Ahora, ¿cómo enviamos datos a este ''oyente''? Acceda a su controlador de notificaciones automáticas (o desde donde desea actualizar su actividad) y cuando reciba una notificación, llame a esta función:

// This function will create an intent. This intent must take as parameter the "unique_name" that you registered your activity with static void updateMyActivity(Context context, String message) { Intent intent = new Intent("unique_name"); //put whatever data you want to send, if any intent.putExtra("message", message); //send broadcast context.sendBroadcast(intent); }

Cuando llamas a la función anterior, tu actividad debería recibirla.

Nota : su actividad debe estar ejecutándose / abierta para recibir el intento de difusión

Nota 2 : Cambié a una biblioteca llamada ''otto''. De hecho, es lo mismo pero más fácil, ''difunde eventos'' a través de la aplicación. Aquí hay un enlace http://square.github.io/otto/


Para resumir en una sola oración: si desea actualizar la actividad, difunda su evento personalizado cuando llegue la notificación y registre su actividad como receptor de difusión de ese evento.


Parece que hay una manera más fácil. En el método OnMessageReceived de GCM Listener, puede hacer la actualización desde allí en lugar de enviar la notificación. Puede usar el mismo código que habría utilizado si procesara la notificación. Si está haciendo StartActivity desde el oyente, debe usar el indicador ActivityFlags.NewTask.


Si su aplicación ya se está ejecutando, intente anular el método onNewIntent


Supongo que su GCMBroadcastReceiver está en su propio archivo .java.

En cuanto a refrescar una actividad, también me gustaría saber la respuesta a esa pregunta.

Pero para saber si una actividad en particular está activa o no, lo que significa en la pantalla simplemente agrega un boolean (llámalo algo así como "activo") y onResume() en true en el evento onResume() tu actividad, y false en el evento onPause() :

protected void onResume() { super.onResume(); active = true;; } protected void onPause() { super.onPause(); active = false; }

Su variable active sería un booleano que es global o static . De esta forma sabrá si una actividad en particular está en "frente".

Espero que esto ayude un poco.


Intent notificationIntent = new Intent(context, MainActivity.class); notificationIntent.setAction(Long.toString(System.currentTimeMillis())); PendingIntent.getActivity(context, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);