DEV Community

Manjot Singh
Manjot Singh

Posted on

🚀 Implementing Foreground Services in React Native for Android 🚀🚀

Implementing Foreground Services in React Native for Android 🎯

Foreground services are an essential feature in Android applications, particularly for tasks that need to run continuously and keep the user informed via notifications. This can include activities such as music playback, location tracking, or long-running network operations. In this article, we'll explore how to implement foreground services in a React Native application for Android, and we'll throw in some fun GIFs and comments to keep things light and engaging!

What is a Foreground Service?

A foreground service is a service that performs some operation that is noticeable to the user. Foreground services must display a status bar notification, which helps ensure that the user is aware of what your app is doing. This makes them ideal for tasks that the user needs to be aware of, such as playing music or tracking location.

Excited about Foreground Services

"Yes! Foreground services are going to make my app awesome!"

Setting Up a Foreground Service in React Native

To set up a foreground service in a React Native application, we need to write some native Android code. This involves creating a service in Java or Kotlin and then integrating it with our React Native app.

Step-by-Step Guide:

  1. Create a New React Native Project:

First, create a new React Native project if you don't already have one:

   npx react-native init ForegroundServiceExample
   cd ForegroundServiceExample
Enter fullscreen mode Exit fullscreen mode

Creating a new project

"Starting a new project like a boss!"

  1. Modify AndroidManifest.xml:

Update your AndroidManifest.xml to declare the foreground service and add the necessary permissions.

   <manifest xmlns:android="http://schemas.android.com/apk/res/android"
       package="com.foregroundserviceexample">

       <application
           android:allowBackup="true"
           android:label="@string/app_name"
           android:icon="@mipmap/ic_launcher"
           android:roundIcon="@mipmap/ic_launcher_round"
           android:supportsRtl="true"
           android:theme="@style/AppTheme">

           <service android:name=".MyForegroundService"
                    android:foregroundServiceType="location|mediaPlayback"/>
       </application>

       <uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
   </manifest>
Enter fullscreen mode Exit fullscreen mode
  1. Create the Foreground Service:

Create a new Java or Kotlin file for your service. Here, we'll use Java for simplicity.

MyForegroundService.java:

   package com.foregroundserviceexample;

   import android.app.Notification;
   import android.app.NotificationChannel;
   import android.app.NotificationManager;
   import android.app.PendingIntent;
   import android.app.Service;
   import android.content.Intent;
   import android.os.Build;
   import android.os.IBinder;
   import androidx.annotation.Nullable;
   import androidx.core.app.NotificationCompat;

   public class MyForegroundService extends Service {

       private static final String CHANNEL_ID = "ForegroundServiceChannel";

       @Nullable
       @Override
       public IBinder onBind(Intent intent) {
           return null;
       }

       @Override
       public int onStartCommand(Intent intent, int flags, int startId) {
           createNotificationChannel();
           Intent notificationIntent = new Intent(this, MainActivity.class);
           PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);

           Notification notification = new NotificationCompat.Builder(this, CHANNEL_ID)
                   .setContentTitle("Foreground Service")
                   .setContentText("Service is running in the foreground")
                   .setSmallIcon(R.drawable.ic_notification)
                   .setContentIntent(pendingIntent)
                   .build();

           startForeground(1, notification);

           // Perform your long-running task here

           return START_NOT_STICKY;
       }

       private void createNotificationChannel() {
           if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
               NotificationChannel serviceChannel = new NotificationChannel(
                       CHANNEL_ID,
                       "Foreground Service Channel",
                       NotificationManager.IMPORTANCE_DEFAULT
               );
               NotificationManager manager = getSystemService(NotificationManager.class);
               if (manager != null) {
                   manager.createNotificationChannel(serviceChannel);
               }
           }
       }

       @Override
       public void onDestroy() {
           super.onDestroy();
       }
   }
Enter fullscreen mode Exit fullscreen mode

Creating a service

"Creating services like a coding ninja!"

  1. Triggering the Foreground Service from React Native:

Use the React Native NativeModules to start and stop the foreground service.

App.js:

   import React from 'react';
   import { View, Button, NativeModules } from 'react-native';

   const App = () => {
     const startService = () => {
       NativeModules.ForegroundServiceModule.startService();
     };

     const stopService = () => {
       NativeModules.ForegroundServiceModule.stopService();
     };

     return (
       <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>
         <Button title="Start Service" onPress={startService} />
         <Button title="Stop Service" onPress={stopService} />
       </View>
     );
   };

   export default App;
Enter fullscreen mode Exit fullscreen mode
  1. Creating Native Modules:

Create a new Java class for the native module that will allow React Native to communicate with the foreground service.

ForegroundServiceModule.java:

   package com.foregroundserviceexample;

   import com.facebook.react.bridge.ReactApplicationContext;
   import com.facebook.react.bridge.ReactContextBaseJavaModule;
   import com.facebook.react.bridge.ReactMethod;
   import com.facebook.react.bridge.Callback;
   import android.content.Intent;

   public class ForegroundServiceModule extends ReactContextBaseJavaModule {
       private static ReactApplicationContext reactContext;

       ForegroundServiceModule(ReactApplicationContext context) {
           super(context);
           reactContext = context;
       }

       @Override
       public String getName() {
           return "ForegroundServiceModule";
       }

       @ReactMethod
       public void startService() {
           Intent serviceIntent = new Intent(reactContext, MyForegroundService.class);
           if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
               reactContext.startForegroundService(serviceIntent);
           } else {
               reactContext.startService(serviceIntent);
           }
       }

       @ReactMethod
       public void stopService() {
           Intent serviceIntent = new Intent(reactContext, MyForegroundService.class);
           reactContext.stopService(serviceIntent);
       }
   }
Enter fullscreen mode Exit fullscreen mode

Finally, register the module in the MainApplication.java:

   import com.foregroundserviceexample.ForegroundServiceModule;

   @Override
   public List<ReactPackage> getPackages() {
       return Arrays.<ReactPackage>asList(
           new MainReactPackage(),
           new ForegroundServicePackage() // Add this line
       );
   }
Enter fullscreen mode Exit fullscreen mode

Coding ninja

"Feeling like a coding ninja after setting up native modules!"

Conclusion

Foreground services in Android allow your React Native application to perform long-running tasks while keeping the user informed through notifications. By following this guide, you can implement foreground services to handle tasks such as music playback, location tracking, and more. Although this requires some native Android code, it significantly enhances the capabilities and user experience of your app.

By leveraging foreground services effectively, you can ensure that critical tasks are performed reliably, even when your app is not in the foreground. This can greatly improve the functionality and user satisfaction of your React Native applications.

All done

"Mission accomplished! Your app is now ready to rock with foreground services."

Top comments (2)

Collapse
 
upendra_yadav profile image
Upendra Yadav • Edited

can you please help me understand the code

I did tried the code mentioned above but it's not working

Thank you!

Image description
This is the errors, I am facing

Collapse
 
manjotdhiman profile image
Manjot Singh • Edited

Hi Upendra, can you share entire foreground service file ForegroundServiceModule.java?