Actualización de la actividad al recibir la notificación push de gcm


Actualizar: GCM {[5] } está en desuso, use FCM

Cómo actualizar actividad en recibir notificación push de gcm si mi aplicación está abierta. Tengo una actividad que contiene listview llena de datos del servidor. Quiero actualizar mi actividad (aquí agregar un elemento más a listview) , si recibo una notificación push de gcm (que también contiene algunos datos).

  • Una alternativa es agregar temporizador que periódicamente hacer solicitudes de servidor y actualizar los datos del adaptador de lista, pero no quiero estos porque va a tomar muchos recursos.
  • ¿Necesito agregar receptor de difusión ¿qué se activará al recibir gcm push qué solicitud adicional para los datos del servidor más nuevos y actualizar mi IU de actividad?

Estimados comentaristas, por favor lea la pregunta cuidadosamente, solo necesito actualizar la lista (si la aplicación está abierta y que en particular la actividad está abierta) de lo contrario no hay necesidad de la misma.

Author: Amrit Pal Singh, 2014-03-07

7 answers

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

La idea es que usted tiene que 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'? Vaya a su controlador de notificaciones push (o desde donde desea actualizar su actividad) y cuando reciba una notificación llamar 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 : Tu actividad debe estar en ejecución / abierta para recibir la intent de difusión

Note2: Cambié a una biblioteca llamada 'otto'. En realidad, hace 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/

 138
Author: Arthur,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-07 15:45:59

Asumo 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 agregue un boolean (llámelo algo así como "activo") y póngalo en {[3] } en el evento onResume() de su actividad, y en 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 manera usted sabe si un actividad particular está en "frente".

Espero que eso ayude un poco.

 3
Author: PaulG,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-12 13:54:21

La respuesta accept es correcta para la "Actividad de actualización al recibir la notificación push de gcm" (también he votado a favor). Pero si solo desea actualizar una vista de lista que se muestra, no necesita un receptor de transmisión.

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

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

Notificar registred observers that a row was updated. Para inscribirse, llame registerContentObserver(). Por defecto, los objetos CursorAdapter obtendrán esta notificación. Si syncToNetwork es true, esto intentará programe una sincronización local con el adaptador de sincronización registrado para el autoridad del uri proporcionado. No se pasará ninguna cuenta a la sincronización adaptador, por lo que todas las cuentas coincidentes se sincronizarán.

 2
Author: e4c5,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-09 11:03:02

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

 1
Author: Amanni,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-29 10:37:10

Parece que hay una manera más fácil. En el método onMessageReceived del Oyente de GCM, solo puede hacer la actualización desde allí en lugar de enviar la notificación. Puede utilizar el mismo código que habría utilizado si procesara la notificación. Si estás haciendo startActivity desde el receptor, tienes que usar ActivityFlags.Bandera NewTask.

 0
Author: fbs419,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-15 14:58:15

Para resumirlo en una sola oración: Si desea actualizar actividad, emisión su personalizada de eventos de notificación cuando llegue y registro su actividad como difusión receptor de que el evento

 0
Author: Srneczek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-21 19:43:12
Intent notificationIntent = new Intent(context, MainActivity.class);
notificationIntent.setAction(Long.toString(System.currentTimeMillis()));
PendingIntent.getActivity(context, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
 -4
Author: prasad thangavel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-07 14:35:52