I have implemented FCM (Firebase Notification) and everything is working fine on all devices except Samsung Galaxy S8 and One-Plus 3
When application running in foreground/background everything is working perfectly
But when I Remove the application from Task Manager (Swipe-Tray) or finish the application using backPress()
devices stop receiving notification,
My complete code of service and manifest.
MyFirebaseMessagingService
public class MyFirebaseMessagingService extends FirebaseMessagingService {
private static final String TAG = MyFirebaseMessagingService.class.getSimpleName();
/**
* Called when message is received.
*
* @param remoteMessage Object representing the message received from Firebase Cloud Messaging.
*/
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
Log.d(TAG, "From: " + remoteMessage.getFrom());
if (!remoteMessage.getData().containsKey("subtitle")) {
if (remoteMessage.getData().size() > 0) {
Log.d(TAG, "Message data payload: " + remoteMessage.getData());
String title = remoteMessage.getData().get("title");
String message = remoteMessage.getData().get("text");
String rideId = remoteMessage.getData().get("ride_id");
String rideName = remoteMessage.getData().get("ride_name");
String ridePic = remoteMessage.getData().get("ride_pic");
MessageDTO messageDTO = new MessageDTO();
messageDTO.setRideId(Integer.parseInt(rideId));
messageDTO.setRideName(rideName);
messageDTO.setRidePic(ridePic);
messageDTO.setMessage(message);
// Don't show notification if chat activity is open.
if (!AppController.isChatActivityOpen()) {
sendNotification(title, messageDTO);
} else {
//EventBus.getDefault().post(new PushNotificationEvent(title, message, username, uid, fcmToken));
}
}
}
// Check if message contains a data payload.
}
/**
* Create and show a simple notification containing the received FCM message.
*/
private boolean sendNotification(String title, MessageDTO messageDTO) {
int id = (int) System.currentTimeMillis();
Intent intent = new Intent(this, GroupChatActivity.class);
intent.putExtra("SelectedChannel", messageDTO);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);
Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle(title)
.setContentText(messageDTO.getMessage())
.setAutoCancel(true)
.setSound(defaultSoundUri)
.setContentIntent(pendingIntent);
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(id, notificationBuilder.build());
int returnValue = 0;
return returnValue == 1 ? true : false;
}
}
AndroidManifest.xml
<service
android:name="main.cyclesoon.com.chat.fcm.MyFirebaseMessagingService" android:stopWithTask="false">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</service>
My server side code :
public class FcmNotificationBuilder {
public static final MediaType MEDIA_TYPE_JSON = MediaType.parse("application/json; charset=utf-8");
private static final String TAG = "FcmNotificationBuilder";
private static final String SERVER_API_KEY = "server_key";
private static final String CONTENT_TYPE = "Content-Type";
private static final String APPLICATION_JSON = "application/json";
private static final String AUTHORIZATION = "Authorization";
private static final String AUTH_KEY = "key=" + SERVER_API_KEY;
private static final String FCM_URL = "https://fcm.googleapis.com/fcm/send";
// json related keys
//private static final String KEY_TO = "to";
private static final String KEY_TO = "registration_ids";
private static final String KEY_TITLE = "title";
private static final String KEY_TEXT = "text";
//private static final String KEY_DATA = "data";
private static final String KEY_DATA = "notification";
private static final String KEY_RIDE_ID = "ride_id";
private static final String KEY_RIDE_NAME = "ride_name";
private static final String KEY_RIDE_PIC = "ride_pic";
private String mTitle;
private String mMessage;
private JSONArray mReceiverFirebaseToken;
private String mRideId;
private String mRideName;
private String mRidePic;
private FcmNotificationBuilder() {
}
public static FcmNotificationBuilder initialize() {
return new FcmNotificationBuilder();
}
public FcmNotificationBuilder title(String title) {
mTitle = title;
return this;
}
public FcmNotificationBuilder message(String message) {
mMessage = message;
return this;
}
public FcmNotificationBuilder setRideInfo(String rideId, String rideName, String ridePic) {
mRideId = rideId;
mRideName = rideName;
mRidePic = ridePic;
return this;
}
public FcmNotificationBuilder receiverFirebaseToken(JSONArray receiverFirebaseToken) {
mReceiverFirebaseToken = receiverFirebaseToken;
return this;
}
public void send() {
RequestBody requestBody = null;
try {
requestBody = RequestBody.create(MEDIA_TYPE_JSON, getValidJsonBody().toString());
} catch (JSONException e) {
e.printStackTrace();
}
Request request = new Request.Builder()
.addHeader(CONTENT_TYPE, APPLICATION_JSON)
.addHeader(AUTHORIZATION, AUTH_KEY)
.url(FCM_URL)
.post(requestBody)
.build();
Call call = new OkHttpClient().newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.d(TAG, "onGetAllUsersFailure: " + e.getMessage());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Log.d(TAG, "onResponse: " + response.body().string());
}
});
}
private JSONObject getValidJsonBody() throws JSONException {
JSONObject jsonObjectBody = new JSONObject();
///JSONArray jsonArray = new JSONArray();
//jsonArray.put(mReceiverFirebaseToken);
//jsonArray.put("fPMLS022iPE:APA91bEBJjgUDN-mSPtZjS4EtWT_DGnTmajc8gaWJUjULjodPrq9OUvhSHc3Lkk1Mxx8Z_b6g6NpJhKqe0WxZETz6vpnAxL2UnYU5qZYM2u0YEZdF0JgX0bD0jViqi6guKmwE_rss2CK");
//jsonObjectBody.put(KEY_TO, mReceiverFirebaseToken);
jsonObjectBody.put(KEY_TO, mReceiverFirebaseToken);
JSONObject jsonObjectData = new JSONObject();
jsonObjectData.put(KEY_TITLE, mTitle);
jsonObjectData.put(KEY_TEXT, mMessage);
jsonObjectData.put(KEY_RIDE_ID, mRideId);
jsonObjectData.put(KEY_RIDE_NAME, mRideName);
jsonObjectData.put(KEY_RIDE_PIC, mRidePic);
jsonObjectBody.put(KEY_DATA, jsonObjectData);
return jsonObjectBody;
}
}