Firebase notification foreground and background then kill application with Oreo Update
Firebase
foreground
background
application
Oreo
notification
KillMode
- By Code solution
- Jan 20th, 2021
- 0 comments
- 1
Firebase Cloud Messaging (FCM) is a cross-platform messaging solution that lets you reliably deliver messages at no cost.
Using FCM, you can notify a client app that new email or other data is available to sync. You can send notification messages to drive user re-engagement and retention. For use cases such as instant messaging, a message can transfer a payload of up to 4KB to a client app.
- Create a new project in Android Studio. While filling the project details, use the same package name which you gave in firebase console.
- Paste the google-services.json file to your project’s app folder. This step is very important as your project won’t build without this file.
- Then open the build.gradle located in project’s home directory and add firebase dependency.
dependencies { classpath 'com.android.tools.build:gradle:3.3.0' classpath 'com.google.gms:google-services:4.2.0' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files }
- Open app/build.gradle and add firebase messaging dependency. At the very bottom of the file, add apply plugin: ‘com.google.gms.google-services’.
dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) //noinspection GradleCompatible implementation 'com.android.support:appcompat-v7:28.0.0' implementation 'com.android.support.constraint:constraint-layout:1.1.3' implementation 'com.google.firebase:firebase-messaging:17.+' testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' } apply plugin: 'com.google.gms.google-services'
- Create three packages named services your project folder.
- Create a class named MyFirebaseMessagingService.java under services package.
public class MyFirebaseMessagingService extends FirebaseMessagingService { private static final String CHANNEL_ID = "Bestmarts"; private static final String CHANNEL_NAME = "Bestmarts"; @Override public void onMessageReceived(RemoteMessage remoteMessage) { super.onMessageReceived(remoteMessage); if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){ sendNotification1(remoteMessage); }else{ sendNotification(remoteMessage); } } @SuppressLint("LongLogTag") private void sendNotification(RemoteMessage remoteMessage) { if (!isAppIsInBackground(getApplicationContext())) { //foreground app Log.e("remoteMessage foreground", remoteMessage.getData().toString()); String title = remoteMessage.getNotification().getTitle(); String body = remoteMessage.getNotification().getBody(); Intent resultIntent = new Intent(getApplicationContext() , MainActivity.class); resultIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(), 0 /* Request code */, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT); NotificationManager notificationManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE); NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(getApplicationContext(), CHANNEL_ID); notificationBuilder.setAutoCancel(true) .setDefaults(Notification.DEFAULT_ALL) .setWhen(System.currentTimeMillis()) .setSmallIcon(R.drawable.ic_launcher_background) .setBadgeIconType(NotificationCompat.BADGE_ICON_SMALL) .setNumber(10) .setTicker("Bestmarts") .setContentTitle(title) .setContentText(body) .setContentInfo("Info"); notificationManager.notify(1, notificationBuilder.build()); }else{ Log.e("remoteMessage background", remoteMessage.getData().toString()); Map data = remoteMessage.getData(); String title = data.get("title"); String body = data.get("body"); Intent resultIntent = new Intent(getApplicationContext() , MainActivity.class); resultIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(), 0 /* Request code */, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT); NotificationManager notificationManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE); NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(getApplicationContext(), CHANNEL_ID); notificationBuilder.setAutoCancel(true) .setDefaults(Notification.DEFAULT_ALL) .setWhen(System.currentTimeMillis()) .setSmallIcon(R.drawable.ic_launcher_background) .setBadgeIconType(NotificationCompat.BADGE_ICON_SMALL) .setNumber(10) .setTicker("Bestmarts") .setContentTitle(title) .setContentText(body) .setContentInfo("Info"); notificationManager.notify(1, notificationBuilder.build()); } } public static boolean isAppIsInBackground(Context context) { boolean isInBackground = true; ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT_WATCH) { List runningProcesses = am.getRunningAppProcesses(); for (ActivityManager.RunningAppProcessInfo processInfo : runningProcesses) { if (processInfo.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) { for (String activeProcess : processInfo.pkgList) { if (activeProcess.equals(context.getPackageName())) { isInBackground = false; } } } } } else { List taskInfo = am.getRunningTasks(1); ComponentName componentInfo = taskInfo.get(0).topActivity; if (componentInfo.getPackageName().equals(context.getPackageName())) { isInBackground = false; } } return isInBackground; } @SuppressLint("NewApi") private void sendNotification1(RemoteMessage remoteMessage) { if (!isAppIsInBackground(getApplicationContext())) { //foreground app Log.e("remoteMessage", remoteMessage.getData().toString()); String title = remoteMessage.getNotification().getTitle(); String body = remoteMessage.getNotification().getBody(); Intent resultIntent = new Intent(getApplicationContext(), MainActivity.class); resultIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(), 0 /* Request code */, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT); Uri defaultsound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); OreoNotification oreoNotification = new OreoNotification(this); Notification.Builder builder = oreoNotification.getOreoNotification(title, body, pendingIntent, defaultsound, String.valueOf(R.drawable.ic_launcher_background)); int i = 0; oreoNotification.getManager().notify(i, builder.build()); }else{ Log.e("remoteMessage", remoteMessage.getData().toString()); String title = remoteMessage.getData().get("title"); String body = remoteMessage.getData().get("body"); Intent resultIntent = new Intent(getApplicationContext(), MainActivity.class); resultIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(), 0 /* Request code */, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT); Uri defaultsound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); OreoNotification oreoNotification = new OreoNotification(this); Notification.Builder builder = oreoNotification.getOreoNotification(title, body, pendingIntent, defaultsound, String.valueOf(R.drawable.ic_launcher_background)); NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); int i = 0; oreoNotification.getManager().notify(i, builder.build()); } } @Override public void onNewToken(String s) { super.onNewToken(s); Log.e("NEW_TOKEN = = == = = =",s); } }
- Create a class named OreoNotification.java under services package
public class OreoNotification extends ContextWrapper { private static final String CHANNEL_ID = "Fcm Test"; private static final String CHANNEL_NAME = "Fcm Test"; private NotificationManager notificationManager; public OreoNotification(Context base) { super(base); if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.O){ createChannel(); } } @TargetApi(Build.VERSION_CODES.O) private void createChannel() { NotificationChannel channel = new NotificationChannel(CHANNEL_ID, CHANNEL_NAME, NotificationManager.IMPORTANCE_HIGH); channel.setDescription("Fcm Test channel for app test FCM"); channel.enableLights(true); channel.enableVibration(true); channel.setVibrationPattern(new long[]{100, 200, 300, 400, 500, 400, 300, 200, 400}); channel.setShowBadge(false); channel.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE); getManager().createNotificationChannel(channel); } public NotificationManager getManager(){ if(notificationManager == null){ notificationManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE); } return notificationManager; } @TargetApi(Build.VERSION_CODES.O) public Notification.Builder getOreoNotification(String title, String body, PendingIntent pendingIntent, Uri soundUri, String icon){ return new Notification.Builder(getApplicationContext(), CHANNEL_ID) .setAutoCancel(true) .setBadgeIconType(NotificationCompat.BADGE_ICON_SMALL) .setDefaults(Notification.DEFAULT_ALL) .setWhen(System.currentTimeMillis()) .setSmallIcon(R.drawable.ic_launcher_background) .setTicker("Fcm Test") .setNumber(10) .setContentTitle(title) .setContentText(body) .setContentIntent(pendingIntent) .setContentInfo("Info"); } }
- Open AndroidManifest.xml and add the two firebase services MyFirebaseMessagingService.
<application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <meta-data android:name="com.google.firebase.messaging.default_notification_icon" android:resource="@drawable/ic_launcher_background" /> <meta-data android:name="com.google.firebase.messaging.default_notification_color" android:resource="@color/colorAccent" /> <meta-data android:name="com.google.firebase.messaging.default_notification_channel_id" android:value="@string/default_notification_channel_id" /> <service android:name=".services.MyFirebaseMessagingService"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> intent-filter> service> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> intent-filter> activity> application>
- Open MainActivity.java and do the below necessary changes.
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener( MainActivity.this, new OnSuccessListener() { @Override public void onSuccess(InstanceIdResult instanceIdResult) { String newToken = instanceIdResult.getToken(); Log.e("get token",newToken); } }); } }