Setting up push notifications in your Android application
Summarize
Summary of Setting up push notifications in your Android application
This guide explains how to configure push notifications in your Android app integrated with your ServiceNow® instance. Besides configuring notifications on the ServiceNow side, you need to incorporate specific code into your Android application using the NowSDK's NowPushService and Firebase Messaging to register, handle, and unregister push tokens.
Show less
Key Implementation Steps
- Create the NowPushService: Initialize the NowPushService once during the app lifecycle, preferably in the Application class or a manager class injected via Dagger/Hilt. Use
NowPushSDK.makePushService()with your ServiceNow instance URL to create the service. - Register the push token: Obtain the device's unique push token from Firebase Messaging. Register this token with the NowPushService using
registerPushToken(), providing your app’s registered name in ServiceNow. Properly handle success and error callbacks for registration. - Unregister the push token: When the user logs out or exits the app, unregister the push token via
unregisterPushToken()to ensure notifications are stopped for that device. Again, supply the app’s registered name and handle callbacks accordingly. - Implement FirebaseMessagingService: Follow Android Firebase documentation to set up this service. Override
onMessageReceived()to pass incoming messages to NowPushService'shandlePush(). This enables the app to process recognized ServiceNow push notifications such as NowPushVirtualAgent. Handle unknown notifications separately. Also overrideonNewToken()to re-register updated push tokens with NowPushService.
Practical Benefits
By integrating these components, your Android application will reliably receive and process push notifications from your ServiceNow instance, improving real-time communication with users. Proper registration and unregistration of tokens help maintain security and notification accuracy tied to user sessions. Implementing the FirebaseMessagingService ensures your app correctly interprets and handles ServiceNow-specific push payloads.
This setup empowers ServiceNow customers to deliver timely notifications inside their Android apps, enhancing user engagement and operational responsiveness.
In addition to the tasks that you must perform on your ServiceNow® instance to configure a push notification, you must also include specific code in your Android application.
Create the NowSDK NowPushService
One of the first things that needs to be done in your application is to retrieve the NowSDK NowPushService. Add code similar to the following snippet early within your main code body.
/**
* Helper class used to handle different Now service instances.
*/
@Singleton
class SdkManager @Inject constructor() {
private var nowPushService: NowPushService? = null
/**
* Create the NowPushService once in the lifetime of the application inside the Application
* class or another manager class that will be injected into other classes via dagger/hilt.
* NowPushService should be created after initializing the NowSDK
*/
suspend fun getNowPushService(): NowPushService? {
if (nowPushService != null) return nowPushService
return NowPushSDK.makePushService(URL("https://instance-name.service-now.com")).getOrThrow()
.also { this.nowPushService = it }
}
}
For additional information on the NowPushSDK.makePushService() method, refer to NowPushSDK - makePushService(instanceURL: URL).
Register the push token
Google Firebase provides a unique push token that identifies the device and application to receive push notifications. In order for an application to receive push notification, you must register this token using the NowPushService. Add a function similar to the following code snippet in your Android application. Ensure that you change PushAppName to the name of your Android application. This application must be registered with your ServiceNow® instance.
FirebaseMessaging.getInstance().token.addOnCompleteListener {task ->
val token = task.result
if (!task.isSuccessfull || token == null) {
throw Exception("Unable to fetch token"))
}
pushService.registerPushToken(token, "PushAppName", {
Log.v(TAF, "Successfully registered push token")
}, { e ->
Log.e(TAG, "Error registrating push", e)
})
}
For additional information on the registerPushToken() method, refer to NowPushService - registerPushToken(pushToken: String, pushApp: String, successCallback: Runnable, errorCallback: Consumer<Throwable>).
Unregister the push token
You need to unregister the push token whenever the user exits your application, such as when the user logs out. Use code similar to the following code snippet to unregister the push token. Ensure that you change PushAppName to the name of your Android application.
pushService.unregisterPushToken(token, "PushAppName", {
Log.v(TAG, "Successfully unregistered push token")
}, { e ->
Log.e(TAG, "Error unregistering push", e)
})
For additional information on the unregisterPushToken() method, refer to NowPushService - unregisterPushToken(pushToken: String, pushApp: String, successCallback: Runnable, errorCallback: Consumer<Throwable>).
Implement the FirebaseMessagingService
You must implement the FirebaseMessagingService within your application.
To setup and implement this service, follow the instructions in the Android Firebase documentation.
Once setup, override the onMessageReceived() method and pass the
RemoteMessage through to the NowPushService. If the
NowPushService recognizes the notification, it will process it and return
the notification object for the application to handle. Currently, the only implemented
notification is NowPushVirtualAgent. An unknown notification returns a
NotSupportedPushError object.
//Custom coroutineScope created in the Firebase service class
private val serviceCoroutineScope = CoroutineScope(Dispatchers.IO)
override fun onMessageReceived(remoteMessage: RemoteMessage) {
serviceCoroutineScope.launch {
val result = handleNowPush(remoteMessage)
if (result.isSuccess) {
when (val push = result.getOrNull()) {
is NowPushVirtualAgent -> handleVirtualAgentPush(push)
}
} else {
// Not a NowPush. Handle host app push notification message here
}
}
}
private suspend fun handleNowPush(remoteMessage: RemoteMessage): Result<NowPushPayload> {
val nowPushService = sdkManager.getNowPushService()
return suspendCoroutine { cont ->
nowPushService?.handlePush(remoteMessage,
{ cont.resume(Result.success(it)) }, { cont.resumeWithException(it) })
}
}
For additional information on the handlePush() method, refer to NowPushService - handlePush(remoteMessage: RemoteMessage, successCallback: Consumer<NowPushPayload>, errorCallback: Consumer<Throwable>).
In addition, you must override onNewToken(token: String). Be sure to pass the token through to the pushService.registerPushToken(), similar to what was done in the "Register the push token" section.