android - sistema - La notificación push funciona incorrectamente cuando la aplicación está en segundo plano o no se está ejecutando
quitar notificacion sin servicio de datos android (2)
Estoy usando Firebase Cloud Messaging para enviar notificaciones push.
Aquí está mi
FirebaseMessageService
:
public class FireBaseMessageService extends FirebaseMessagingService {
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
Log.e("TAG", "From: " + remoteMessage.getFrom());
Log.e("TAG", "Notification Message Body: " + remoteMessage.getData().get("CardName")+" : "+remoteMessage.getData().get("CardCode"));
sendNotification(remoteMessage.getNotification().getBody());
}
private void sendNotification(String messageBody) {
Intent intent = new Intent(this, StartActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
PendingIntent.FLAG_ONE_SHOT);
Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
.setSmallIcon(R.mipmap.ic_launcher_final)
.setContentTitle("Notification")
.setContentText(messageBody)
.setTicker("Test")
.setAutoCancel(true)
.setDefaults(Notification.DEFAULT_SOUND)
.setContentIntent(pendingIntent);
NotificationManager notificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
}
}
Y
FirebaseInstanceServer
:
public class FirebaseInstanceService extends FirebaseInstanceIdService {
@Override
public void onTokenRefresh() {
// Get updated InstanceID token.
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
Log.e("TAG", "Refreshed token: " + refreshedToken);
// TODO: Implement this method to send any registration to your app''s servers.
sendRegistrationToServer(refreshedToken);
}
private void sendRegistrationToServer(String token) {
// Add custom implementation, as needed.
Log.e("TAG", "Refreshed token2: " + token);
}
}
Que se declara en el
AndroidManifest
:
<service
android:name=".util.notifications.FireBaseMessageService">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT"/>
</intent-filter>
</service>
<service
android:name=".util.notifications.FirebaseInstanceService">
<intent-filter>
<action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
</intent-filter>
</service>
Entonces, el problema es que cuando la aplicación se está ejecutando, el
ticker
se muestra bien y la notificación viene con un sonido predeterminado, pero cuando la aplicación está en segundo plano o no se está ejecutando, la notificación viene sin ningún sonido y el
ticker
no se muestra en la barra de estado.
¿Por qué sucede esto y cómo puedo solucionarlo?
Con FCM usted especifica una carga útil POST para enviar a
https://fcm.googleapis.com/fcm/send
.
En esa carga útil puede especificar
data
o una clave de
notification
, o ambos.
Si su carga útil contiene solo una clave de
data
, su aplicación manejará todos los mensajes push.
Por ejemplo, todos se entregan a su controlador
onMessageReceived
.
Si su carga útil contiene una clave de
notification
, su aplicación manejará los mensajes push
solo
si su aplicación está activa / en primer plano.
Si no lo está (por lo que está en segundo plano, o se cerró por completo), FCM se encarga de mostrarle la notificación utilizando los valores que coloca en la carga útil de la clave de
notification
.
Tenga en cuenta que las notificaciones enviadas desde una consola (como la consola Firebase) siempre incluyen una clave de
notification
.
Parece que desea manejar los mensajes de FCM usted mismo para poder personalizar la notificación un poco más, etc., por lo que sería mejor no incluir la clave de
notification
en la carga útil POST, de modo que todos los mensajes push se entreguen a su
onMessageReceived
.
Puedes leer más sobre esto aquí:
Opciones avanzadas de mensajería
Sintaxis de mensaje descendente
Pasé 2 semanas para entender por qué mi aplicación ya no puede recibir mensajes de datos cuando está en segundo plano y por extraño que pueda ser, ¡llegué a la conclusión de que Android-Studio 2.1.2 es el problema!
Ya no puedo recibir ningún mensaje de FCM en la aplicación en segundo plano