6

I am creating a web app which sends notification from my web server to the app.

I wanted my app to receive notifications even when the app is removed from the background. I am using FCM for receiving the notifications.

The app receives notifications when app is in background but doesn't when app is remove from background in android Oreo. The app receives notification in lower android versions even if the app is remove from background.Thanks for any help!

Code of messaging service:

public class MyFirebaseMessagingService extends FirebaseMessagingService {

private static final String TAG = "MyFirebaseMsgService";

@Override
public void handleIntent(Intent intent) {
    super.handleIntent(intent);
}

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {

    Map<String,String> data=remoteMessage.getData();
    String title=data.get("title");
    String body=data.get("body");

    if (remoteMessage.getData().size() > 0) {
        Log.e(TAG, "Data Payload: " + remoteMessage.getData().toString());
        if (/* Check if data needs to be processed by long running job */ true) {
            // For long-running tasks (10 seconds or more) use Firebase Job Dispatcher.
            scheduleJob();
        } else {
            // Handle message within 10 seconds
            handleNow();
        }
        try {
            //JSONObject json = new JSONObject(remoteMessage.getData().toString());
            //sendPushNotification(json);
            sendPushNotification(title,body);

        } catch (Exception e) {
            Log.e(TAG, "Exception: " + e.getMessage());
        }
    }
}

//this method will display the notification
//We are passing the JSONObject that is received from
//firebase cloud messaging
public void sendPushNotification(String title,String message) {
    //optionally we can display the json into log
    //Log.e(TAG, "Notification JSON " + json.toString());
    try {
        //getting the json data
        //JSONObject data = json.getJSONObject("data");

        //parsing json data
        /*String title = data.getString("title");
        String message = data.getString("message");
        String imageUrl = data.getString("image");*/
        String imageUrl="";
        //creating MyNotificationManager object
        MyNotificationManager mNotificationManager = new MyNotificationManager(getApplicationContext());
        //creating an intent for the notification
        Intent intent = new Intent(getApplicationContext(), MainActivity.class);
        //if there is no image
        if(imageUrl.equals("null")){
            //displaying small notification
            mNotificationManager.showSmallNotification(title, message, intent);
            mNotificationManager.playNotificationSound();
        }else{
            //if there is an image
            //displaying a big notification
            mNotificationManager.showBigNotification(title, message, imageUrl, intent);
            mNotificationManager.playNotificationSound();
        }

    } catch (Exception e) {
        Log.e(TAG, "Json Exception: " + e.getMessage());
    }
    /*catch (Exception e) {
        Log.e(TAG, "Exception: " + e.getMessage());
    }*/
}
/**
 * Handle time allotted to BroadcastReceivers.
 */
private void scheduleJob() {
    // [START dispatch_job]
    FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher(new GooglePlayDriver(this));
    Job myJob = dispatcher.newJobBuilder()
            .setService(MyJobService.class)
            .setTag("my-job-tag")
            .setLifetime(Lifetime.FOREVER)
            .setTrigger(Trigger.NOW)
            .setConstraints(Constraint.ON_ANY_NETWORK)
            .setRecurring(true)
            .build();
    dispatcher.mustSchedule(myJob);
    // [END dispatch_job]
}

/**
 * Handle time allotted to BroadcastReceivers.
 */
private void handleNow() {
    Log.d(TAG, "Short lived task is done.");
} }

Code of android manifest:

    <service android:name=".MyFirebaseInstanceIDService">
        <intent-filter>
            <action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
        </intent-filter>
    </service>
    <service android:name=".MyFirebaseMessagingService">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT" />
            <action android:name="android.intent.action.RESPOND_VIA_MESSAGE" />
        </intent-filter>
    </service>
    <service android:name=".MyJobService"
        android:exported="false"
        android:enabled="true">
        <intent-filter>
            <action android:name="com.google.firebase.jobdispatcher.ACTION_EXECUTE" />
        </intent-filter>
    </service>

    <meta-data
        android:name="com.google.firebase.messaging.default_notification_icon"
        android:resource="@mipmap/ic_launcher" />
    <meta-data
        android:name="com.google.firebase.messaging.default_notification_color"
        android:resource="@color/customColor" />
    <meta-data
        android:name="com.google.firebase.messaging.default_notification_channel"
        android:value="@string/default_notification_channel_id" />

code of Myjobservice for firebase job dispatcher

public class MyJobService extends JobService {
private static String tag="jobsstarted";
private AsyncTask mBackgroundTask;
@SuppressLint("StaticFieldLeak")
@Override
public boolean onStartJob(JobParameters job) {
    mBackgroundTask = new AsyncTask() {
        @Override
        protected Object doInBackground(Object[] objects) {
            Context context = MyJobService.this;
            startService(new Intent(context, MyFirebaseMessagingService.class));
            return null;
        }
    };
    mBackgroundTask.execute();
    return true;
}@Override
public boolean onStopJob(JobParameters job) {
    return false;
} }
Peter Haddad
  • 78,874
  • 25
  • 140
  • 134

0 Answers0