tutorial notification notificaciones fcm example app android firebase notifications firebase-realtime-database firebase-cloud-messaging

android - notification - registration id firebase



Firebase(FCM): abre la actividad y pasa datos al hacer clic en la notificación. androide (4)

Después de probar todas las respuestas y blogs surgió con la solución. si alguien lo necesita, use este video como referencia

https://www.youtube.com/watch?v=hi8IPLNq59o

ADEMÁS del video para agregar intenciones en MyFirebaseMessagingService:

public class MyFirebaseMessagingService extends FirebaseMessagingService { private static final String TAG = "MyFirebaseMsgService"; @Override public void onMessageReceived(RemoteMessage remoteMessage) { String user_id = "0"; String date = "0"; String hal_id = "0"; String M_view = "0"; if (remoteMessage.getData().size() > 0) { Log.d(TAG, "Message data payload: " + remoteMessage.getData()); user_id = remoteMessage.getData().get("user_id"); date = remoteMessage.getData().get("date"); cal_id = remoteMessage.getData().get("hal_id"); M_view = remoteMessage.getData().get("M_view"); } String click_action = remoteMessage.getNotification().getClickAction(); //Calling method to generate notification sendNotification(remoteMessage.getNotification().getBody(), remoteMessage.getNotification().getTitle(), user_id, date, hal_id, M_view, click_action); } private void sendNotification(String messageBody, String messageTitle, String user_id, String date, String hal_id, String M_view, String click_action) { Intent intent = new Intent(click_action); intent.putExtra("user_id", user_id); intent.putExtra("date", date); intent.putExtra("hal_id", hal_id); intent.putExtra("M_view", M_view); PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(), 0, intent, PendingIntent.FLAG_ONE_SHOT); Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this); notificationBuilder.setSmallIcon(R.drawable.ic_launcher) .setContentTitle(messageTitle) .setContentText(messageBody) .setAutoCancel(true) .setSound(defaultSoundUri) .setContentIntent(pendingIntent); NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); notificationManager.notify(0, notificationBuilder.build()); }}

y en NotificationReceive nueva actividad en onCreate o onResume agregue esto

notification_Y_N = (TextView) findViewById(R.id.notification_Y_N); user_id_text = (TextView) findViewById(R.id.user_id_text); Intent intent_o = getIntent(); String user_id = intent_o.getStringExtra("user_id"); String date = intent_o.getStringExtra("date"); String hal_id = intent_o.getStringExtra("hal_id"); String M_view = intent_o.getStringExtra("M_view"); notification_Y_N.setText(date); user_id_text.setText(hal_id);

Debe haber una implementación clara de cómo trabajar con notificaciones y datos de Firebase. Leí muchas respuestas pero parece que no puedo hacer que funcione. Aquí están mis pasos:

1.) Estoy pasando notificaciones y datos a Android en PHP y parece estar bien:

$msg = array ( "body" => $body, "title" => $title, "sound" => "mySound" ); $data = array ( "user_id" => $res_id, "date" => $date, "hal_id" => $hal_id, "M_view" => $M_view ); $fields = array ( ''registration_ids'' => $registrationIds, ''notification'' => $msg, ''data'' => $data ); $headers = array ( ''Authorization: key=''.API_ACCESS_KEY, ''Content-Type: application/json'' ); $ch = curl_init(); curl_setopt( $ch,CURLOPT_URL, ''https://android.googleapis.com/gcm/send'' ); curl_setopt( $ch,CURLOPT_POST, true ); curl_setopt( $ch,CURLOPT_HTTPHEADER, $headers ); curl_setopt( $ch,CURLOPT_RETURNTRANSFER, true ); curl_setopt( $ch,CURLOPT_SSL_VERIFYPEER, false ); curl_setopt( $ch,CURLOPT_POSTFIELDS, json_encode( $fields ) ); $result = curl_exec($ch ); curl_close( $ch );

2.) cuando se reciben notificaciones y datos en Android, se muestra una notificación. Cuando hago clic en esta notificación, se abre la aplicación. Pero no puedo encontrar la manera de manejar los datos cuando se abre la aplicación. Hay un par de diferencias cuando la aplicación está en primer plano y en segundo plano. El código que tengo ahora es el siguiente:

public class MyFirebaseMessagingService extends FirebaseMessagingService { private static final String TAG = "MyFirebaseMsgService"; @Override public void onMessageReceived(RemoteMessage remoteMessage) { String user_id = "0"; String date = "0"; String cal_id = "0"; String M_view = "0"; if (remoteMessage.getData().size() > 0) { Log.d(TAG, "Message data payload: " + remoteMessage.getData()); user_id = remoteMessage.getData().get("user_id"); date = remoteMessage.getData().get("date"); hal_id = remoteMessage.getData().get("hal_id"); M_view = remoteMessage.getData().get("M_view"); } //Calling method to generate notification sendNotification(remoteMessage.getNotification().getBody(), user_id, date, hal_id, M_view); } private void sendNotification(String messageBody, String user_id, String date, String hal_id, String M_view) { Intent intent = new Intent(this, MainActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP); intent.putExtra("fcm_notification", "Y"); intent.putExtra("user_id", user_id); intent.putExtra("date", date); intent.putExtra("hal_id", hal_id); intent.putExtra("M_view", M_view); int uniqueInt = (int) (System.currentTimeMillis() & 0xff); PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(), uniqueInt, intent, PendingIntent.FLAG_UPDATE_CURRENT); Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this); notificationBuilder.setSmallIcon(R.drawable.ic_launcher) .setContentText(messageBody) .setAutoCancel(true) .setSound(defaultSoundUri) .setContentIntent(pendingIntent); NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); notificationManager.notify(0, notificationBuilder.build()); }}

3.) Cuando uso el código anterior y cuando hago clic en notificación, todo lo que hace, abre la aplicación si está en segundo plano. Si la aplicación está en primer plano, en la notificación, haga clic en ella, simplemente descarta la notificación. Sin embargo, quiero recibir datos y abrir Actividad específica en ambos escenarios (en segundo plano y en primer plano). Tengo en MainActivity el siguiente código, pero no puedo obtener datos. fcm_notification, date, hal_id devuelve nulo.

public class MainActivity extends Activity { UserFunctions userFunctions; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); setIntent(intent); Intent intent_o = getIntent(); } @Override protected void onResume() { super.onResume(); userFunctions = new UserFunctions(); if(userFunctions.isUserLoggedIn(getApplicationContext())){ Intent intent_o = getIntent(); String fcm_notification = intent_o.getStringExtra("fcm_notification") ; String user_id = intent_o.getStringExtra("user_id"); String date = intent_o.getStringExtra("date"); String hal_id = intent_o.getStringExtra("hal_id"); String M_view = intent_o.getStringExtra("M_view"); Intent intent = new Intent(this, JobList.class); // THIS RETURNS NULL, user_id = null System.out.print("FCM" + user_id); startActivity(intent); finish(); }else{ // user is not logged in show login screen Intent login = new Intent(this, LoginActivity.class); startActivity(login); // Closing dashboard screen finish(); } }}

SI alguien puede dirigir o aconsejar, ¿cómo puedo recuperar datos en MainActivity.java de Firebase en cualquiera de los escenarios (en primer plano o en segundo plano) que sería fantástico.


En primer lugar, pondré los detalles mencionados en los documentos de Manejo de mensajes .

En el resumen debajo de la fila Ambos , muestra que cuando la aplicación está en primer plano , la carga útil se manejará en su onMessageReceived() .

Para abrir la actividad desde onMessageReceived() , debe verificar si los datos que necesita están en la carga útil, si lo hace, llame a su actividad específica y luego pase todos los demás detalles que necesite por intención.

Ahora, si la aplicación está en segundo plano , se menciona en los documentos que la bandeja del sistema Android recibe la notificación y que la carga de data se puede recuperar de los extras de la intención.

Solo agrego los detalles de mi respuesta here que prácticamente da la declaración de documentos y un enlace a una muestra:

Manejar mensajes de notificación en una aplicación de fondo

Cuando su aplicación está en segundo plano, Android dirige los mensajes de notificación a la bandeja del sistema. Un usuario que toca la notificación abre el iniciador de aplicaciones de forma predeterminada.

Esto incluye mensajes que contienen notificaciones y carga de datos (y todos los mensajes enviados desde la consola de Notificaciones). En estos casos, la notificación se entrega a la bandeja del sistema del dispositivo, y la carga de datos se entrega en los extras de la intención de su Actividad de inicio.

Creo que esta answer de @ArthurThompson lo explica muy bien:

Cuando envía un mensaje de notificación con una carga útil de datos (notificación y datos) y la aplicación está en segundo plano, puede recuperar los datos de los extras de la intención que se inicia como resultado de que el usuario toque la notificación.

Del ejemplo de FCM que inicia MainActivity cuando se toca la notificación:

if (getIntent().getExtras() != null) { for (String key : getIntent().getExtras().keySet()) { String value = getIntent().getExtras().getString(key); Log.d(TAG, "Key: " + key + " Value: " + value); } }


No necesita implementar sendNotification y onMessageReceived usted mismo.

Al enviar:

$data = array ( "user_id" => $res_id //whatever fields you want to include ); $msg = array ( "body" => $body, "title" => $title, "data" => $data // more fields );

lado de Android (en su MainACtivity :

private void handleIntent(Intent intent) { String user_id= intent.getStringExtra("user_id"); if(user_id!= null) Log.d(TAG, user_id); }

y por supuesto:

@Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); handleIntent(intent); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); handleIntent(getIntent()); }

los campos que ingrese en los data se enviarán a su intención extra .


Para invocar el método onMessageReceived() , deberá usar otro método para enviar notificaciones (como crear una API web para enviar notificaciones). Luego usándolo,

elimine la carga de notificación de sus mensajes de FCM para que la carga de datos se entregue al método onMessageReceived() .

Cuando su aplicación está en segundo plano, la carga de datos se entrega al método onMessageReceived solo si no hay una carga de notificación.

En caso de que existan ambas cargas útiles, el sistema maneja automáticamente la parte de notificación (bandeja del sistema) y su aplicación obtiene la carga útil de datos en los extras de la intención de la Actividad del iniciador (después de que el usuario toque la notificación).

Para obtener más información, consulte los siguientes enlaces:

  • ¿Por qué está pasando esto? ¿Cómo? ¿Cómo manejar las notificaciones push?
  • Respuesta original de kws. Dale un voto positivo.