Reputation: 732
Notification is not showing when app is running. It works when app is closed.
MyFirebaseMessagingService.java
public class MyFirebaseMessagingService extends FirebaseMessagingService {
private static final String TAG = MyFirebaseMessagingService.class.getSimpleName();
private NotificationUtils notificationUtils;
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
Log.e(TAG, "From: " + remoteMessage.getFrom());
if (remoteMessage == null)
return;
// Check if message contains a notification payload.
if (remoteMessage.getNotification() != null) {
Log.e(TAG, "Notification Body: " + remoteMessage.getNotification().getBody());
handleNotification(remoteMessage.getNotification().getBody());
}
// Check if message contains a data payload.
if (remoteMessage.getData().size() > 0) {
Log.e(TAG, "Data Payload: " + remoteMessage.getData().toString());
try {
JSONObject json = new JSONObject(remoteMessage.getData().toString());
handleDataMessage(json);
} catch (Exception e) {
Log.e(TAG, "Exception: " + e.getMessage());
}
}
}
/**
* Called if InstanceID token is updated. This may occur if the security of
* the previous token had been compromised. Note that this is called when the InstanceID token
* is initially generated so this is where you would retrieve the token.
*/
@Override
public void onNewToken(String token) {
Log.d(TAG, "Refreshed token: " + token);
PrefManager.setStringPreferences ( Constants.REGID, token );
// If you want to send messages to this application instance or
// manage this apps subscriptions on the server side, send the
// Instance ID token to your app server.
// sendRegistrationToServer(token);
}
private void handleNotification(String message) {
if (!NotificationUtils.isAppIsInBackground(getApplicationContext())) {
// app is in foreground, broadcast the push message
Intent pushNotification = new Intent(Config.PUSH_NOTIFICATION);
pushNotification.putExtra("message", message);
LocalBroadcastManager.getInstance(this).sendBroadcast(pushNotification);
// play notification sound
NotificationUtils notificationUtils = new NotificationUtils(getApplicationContext());
notificationUtils.playNotificationSound();
}else{
// If the app is in background, firebase itself handles the notification
}
}
private void handleDataMessage(JSONObject json) {
Log.e(TAG, "push json: " + json.toString());
try {
JSONObject data = json.getJSONObject("data");
String title = data.getString("title");
String message = data.getString("message");
boolean isBackground = data.getBoolean("is_background");
String imageUrl = data.getString("image");
String timestamp = data.getString("timestamp");
JSONObject payload = data.getJSONObject("payload");
Log.e(TAG, "title: " + title);
Log.e(TAG, "message: " + message);
Log.e(TAG, "isBackground: " + isBackground);
Log.e(TAG, "payload: " + payload.toString());
Log.e(TAG, "imageUrl: " + imageUrl);
Log.e(TAG, "timestamp: " + timestamp);
if (!NotificationUtils.isAppIsInBackground(getApplicationContext())) {
// app is in foreground, broadcast the push message
Intent pushNotification = new Intent( Config.PUSH_NOTIFICATION);
pushNotification.putExtra("message", message);
LocalBroadcastManager.getInstance(this).sendBroadcast(pushNotification);
// play notification sound
NotificationUtils notificationUtils = new NotificationUtils(getApplicationContext());
notificationUtils.playNotificationSound();
// if (TextUtils.isEmpty(imageUrl)) {
// showNotificationMessage(getApplicationContext(), title, message, timestamp, pushNotification);
// } else {
// // image is present, show notification with image
// showNotificationMessageWithBigImage(getApplicationContext(), title, message, timestamp, pushNotification, imageUrl);
// }
} else {
// app is in background, show the notification in notification tray
Intent resultIntent = new Intent(getApplicationContext(), HomeActivity.class);
resultIntent.putExtra("message", message);
// check for image attachment
if (TextUtils.isEmpty(imageUrl)) {
showNotificationMessage(getApplicationContext(), title, message, timestamp, resultIntent);
} else {
// image is present, show notification with image
showNotificationMessageWithBigImage(getApplicationContext(), title, message, timestamp, resultIntent, imageUrl);
}
}
} catch (JSONException e) {
Log.e(TAG, "Json Exception: " + e.getMessage());
} catch (Exception e) {
Log.e(TAG, "Exception: " + e.getMessage());
}
}
//Showing notification with text only
private void showNotificationMessage(Context context, String title, String message, String timeStamp, Intent intent) {
notificationUtils = new NotificationUtils(context);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
notificationUtils.showNotificationMessage(title, message, timeStamp, intent);
}
//Showing notification with text and image
private void showNotificationMessageWithBigImage(Context context,String title,String message,String timeStamp,Intent intent,String imageUrl) {
notificationUtils = new NotificationUtils(context);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
notificationUtils.showNotificationMessage(title, message, timeStamp, intent, imageUrl);
}
}
In handleDataMessage()
when app is not in background I put code of showNotificationMessage()
. But when I put showNotificationMessage()
function there notification is not showing whether the app is background or foreground.
When I comment that function notification appears but only when app is in background.
How to show notification when app is foreground?
Upvotes: 9
Views: 11170
Reputation: 91
if you already setup config. don't forget to add priority in the <service.. />
section, like this :
<service
android:name="YOUR_CLASS">
<intent-filter android:priority="1">
....
</intent-filter>
</servive>
Upvotes: 0
Reputation: 8723
In my case (android 8.0 and later) the problem was that the notification was sent to a notification channel I didn't create within the app. The notification payload was something like the one below:
const payload = {
"token": deviceToken,
"notification": {
"title": senderFullName,
"body": senderFullName + ": " + message
},
"data": {
"senderId": senderId,
"body": senderFullName + ": " + message,
"type": "chatNotification"
},
"android": {
"collapse_key": "chat_message_notification",
"notification": {
"channel_id": "chat_notifications_channel",
"imageUrl": senderImageUrl
}
}
However, my app code didn't create the corresponding chat_notifications_channel
, once created everything turned out fine.
private fun createChatNotificationChannel() {
// Create the NotificationChannel, but only on API 26+ because
// the NotificationChannel class is new and not in the support library
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val name = getString(R.string.direct_messages_notification_channel)
val descriptionText = getString(R.string.chat)
val importance = NotificationManager.IMPORTANCE_DEFAULT
// This is the key line
val channel =
NotificationChannel("chat_notifications_channel", name, importance).apply {
description = descriptionText
}
// Register the channel with the system
val notificationManager: NotificationManager =
getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
notificationManager.createNotificationChannel(channel)
}
}
Upvotes: 0
Reputation: 41
Make sure you have aded Firebase Service in your AndroidManifest.xml
<service
android:name=".MyFirebaseMessagingService"
android:exported="false">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
Upvotes: 1
Reputation: 770
By default notification is shown only if app is not in foreground.
If you want to show notification in tray when app is in foreground add custom method to show notification using NotificationCompat.Builder
and call that method in onMessageReceived like
if (remoteMessage.getNotification() != null){
Log.d(TAG, "Objects: " + remoteMessage.getNotification());
generateNotification(getApplicationContext(),remoteMessage.getNotification().getBody());
}
Here is method
private void generateNotification(Context context, String msg) {
NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
String channelId = "channel-fbase";
String channelName = "demoFbase";
int importance = NotificationManager.IMPORTANCE_HIGH;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel mChannel = new NotificationChannel(
channelId, channelName, importance);
notificationManager.createNotificationChannel(mChannel);
}
Intent notificationIntent = new Intent(getApplicationContext(), AboutActivity.class);
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(), 0, notificationIntent, PendingIntent.FLAG_ONE_SHOT);
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context, channelId);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
mBuilder.setSmallIcon(R.mipmap.ic_launcher);
int color = 0x008000;
mBuilder.setColor(color);
} else {
mBuilder.setSmallIcon(R.mipmap.ic_launcher);
}
mBuilder.setStyle(new NotificationCompat.BigTextStyle().bigText(msg));
mBuilder.setContentTitle(msg);
mBuilder.setContentText(msg);
mBuilder.setContentIntent(pendingIntent);
//If you don't want all notifications to overwrite add int m to unique value
Random random = new Random();
int m = random.nextInt(9999 - 1000) + 1000;
mNotificationManager.notify(m, mBuilder.build());
}
Upvotes: 6
Reputation: 1971
If you are getting a notification in kill state then you are using notification payload object. In the foreground, you have to add the code of show notification. You have to write notification code inside the notification:
if (remoteMessage.getNotification() != null) {
Log.e(TAG, "Notification Body: " + remoteMessage.getNotification().getBody());
//Show Notfication
}
For more details, check out official link https://firebase.google.com/docs/cloud-messaging/android/receive
Upvotes: 0
Reputation: 1833
send your notification with Data
object only instead of Notification
.
Upvotes: 0