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;
} }