Displaying push notifications
Learn how to receive and display push notifications sent by Braze using the Braze Android SDK.
Prerequisites
To use this feature, you’ll need to complete the following:
Receiving and displaying notifications
Step 1: Register Braze Firebase Messaging Service
If you already have a Firebase Messaging Service registered, do not complete this step. Instead, proceed to Using your own Firebase Messaging Service and complete the steps listed there.
Braze includes a service to handle push receipt and open intents. Our BrazeFirebaseMessagingService
class will need to be registered in your AndroidManifest.xml
:
1
2
3
4
5
6
<service android:name="com.braze.push.BrazeFirebaseMessagingService"
android:exported="false">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
Our notification code also uses BrazeFirebaseMessagingService
to handle open and click action tracking. This service must be registered in the AndroidManifest.xml
to function correctly. Also, remember that Braze prefixes notifications from our system with a unique key so that we only render notifications sent from our systems. You may register additional services separately to render notifications sent from other FCM services. See AndroidManifest.xml
in the Firebase push sample app.
Before Braze SDK 3.1.1, AppboyFcmReceiver
was used to handle FCM push. The AppboyFcmReceiver
class should be removed from your manifest and replaced with the preceding integration.
Using a fallback Firebase Messaging Service
If you have another Firebase Messaging Service you would also like to use, you can also specify a fallback Firebase Messaging Service to call if your application receives a push that isn’t from Braze.
In your braze.xml
, specify:
1
2
<bool name="com_braze_fallback_firebase_cloud_messaging_service_enabled">true</bool>
<string name="com_braze_fallback_firebase_cloud_messaging_service_classpath">com.company.OurFirebaseMessagingService</string>
or set via runtime configuration:
1
2
3
4
5
BrazeConfig brazeConfig = new BrazeConfig.Builder()
.setFallbackFirebaseMessagingServiceEnabled(true)
.setFallbackFirebaseMessagingServiceClasspath("com.company.OurFirebaseMessagingService")
.build();
Braze.configure(this, brazeConfig);
1
2
3
4
5
val brazeConfig = BrazeConfig.Builder()
.setFallbackFirebaseMessagingServiceEnabled(true)
.setFallbackFirebaseMessagingServiceClasspath("com.company.OurFirebaseMessagingService")
.build()
Braze.configure(this, brazeConfig)
Using your own Firebase Messaging Service
If you already have a Firebase Messaging Service registered, you can pass RemoteMessage
objects to Braze via BrazeFirebaseMessagingService.handleBrazeRemoteMessage()
. This method will only display a notification if the RemoteMessage
object originated from Braze and will safely ignore if not.
1
2
3
4
5
6
7
8
9
10
11
12
13
public class MyFirebaseMessagingService extends FirebaseMessagingService {
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
super.onMessageReceived(remoteMessage);
if (BrazeFirebaseMessagingService.handleBrazeRemoteMessage(this, remoteMessage)) {
// This Remote Message originated from Braze and a push notification was displayed.
// No further action is needed.
} else {
// This Remote Message did not originate from Braze.
// No action was taken and you can safely pass this Remote Message to other handlers.
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
class MyFirebaseMessagingService : FirebaseMessagingService() {
override fun onMessageReceived(remoteMessage: RemoteMessage?) {
super.onMessageReceived(remoteMessage)
if (BrazeFirebaseMessagingService.handleBrazeRemoteMessage(this, remoteMessage)) {
// This Remote Message originated from Braze and a push notification was displayed.
// No further action is needed.
} else {
// This Remote Message did not originate from Braze.
// No action was taken and you can safely pass this Remote Message to other handlers.
}
}
}
Step 2: Conform small icons to design guidelines
For general information about Android notification icons, visit the Notifications overview.
Starting in Android N, you should update or remove small notification icon assets that involve color. The Android system (not the Braze SDK) ignores all non-alpha and transparency channels in action icons and the notification small icon. In other words, Android will convert all parts of your notification small icon to monochrome except for transparent regions.
To properly create a notification small icon asset:
- Remove all colors from the image except for white.
- All other non-white regions of the asset should be transparent.
A common symptom of an improper asset is the small notification icon rendering as a solid monochrome square. This is due to the Android system not being able to find any transparent regions in the notification small icon asset.
The following large and small icons pictured are examples of properly designed icons:
Step 3: Configure notification icons
Specifying icons in braze.xml
Braze allows you to configure your notification icons by specifying drawable resources in your braze.xml
:
1
2
<drawable name="com_braze_push_small_notification_icon">REPLACE_WITH_YOUR_ICON</drawable>
<drawable name="com_braze_push_large_notification_icon">REPLACE_WITH_YOUR_ICON</drawable>
Setting a small notification icon is required. If you do not set one, Braze will default to using the application icon as the small notification icon, which may look suboptimal.
Setting a large notification icon is optional but recommended.
Specifying icon accent color
The notification icon accent color can be overridden in your braze.xml
. If the color is not specified, the default color is the same gray Lollipop uses for system notifications.
1
<integer name="com_braze_default_notification_accent_color">0xFFf33e3e</integer>
You may also optionally use a color reference:
1
<color name="com_braze_default_notification_accent_color">@color/my_color_here</color>
Step 4: Add deep links
Enabling automatic deep link opening
To enable Braze to automatically open your app and any deep links when a push notification is clicked, set com_braze_handle_push_deep_links_automatically
to true
, in your braze.xml
:
1
<bool name="com_braze_handle_push_deep_links_automatically">true</bool>
This flag can also be set via runtime configuration:
1
2
3
4
BrazeConfig brazeConfig = new BrazeConfig.Builder()
.setHandlePushDeepLinksAutomatically(true)
.build();
Braze.configure(this, brazeConfig);
1
2
3
4
val brazeConfig = BrazeConfig.Builder()
.setHandlePushDeepLinksAutomatically(true)
.build()
Braze.configure(this, brazeConfig)
If you want to custom handle deep links, you will need to create a push callback that listens for push received and opened intents from Braze. See our Custom handling push receipts and opens article for more information.
Creating custom deep links
Follow the instructions found within the Android developer documentation on deep linking if you have not already added deep links to your app. To learn more about what deep links are, see our FAQ article.
Adding deep links
The Braze dashboard supports setting deep links or web URLs in push notifications campaigns and Canvases that will be opened when the notification is clicked.
Customizing back stack behavior
The Android SDK, by default, will place your host app’s main launcher activity in the back stack when following push deep links. Braze allows you to set a custom activity to open in the back stack in place of your main launcher activity or to disable the back stack altogether.
For example, to set an activity called YourMainActivity
as the back stack activity using runtime configuration:
1
2
3
4
5
BrazeConfig brazeConfig = new BrazeConfig.Builder()
.setPushDeepLinkBackStackActivityEnabled(true)
.setPushDeepLinkBackStackActivityClass(YourMainActivity.class)
.build();
Braze.configure(this, brazeConfig);
1
2
3
4
5
val brazeConfig = BrazeConfig.Builder()
.setPushDeepLinkBackStackActivityEnabled(true)
.setPushDeepLinkBackStackActivityClass(YourMainActivity.class)
.build()
Braze.configure(this, brazeConfig)
See the equivalent configuration for your braze.xml
. Note that the class name must be the same as returned by Class.forName()
.
1
2
<bool name="com_braze_push_deep_link_back_stack_activity_enabled">true</bool>
<string name="com_braze_push_deep_link_back_stack_activity_class_name">your.package.name.YourMainActivity</string>
Step 5: Define notification channels
The Braze Android SDK supports Android notification channels. If a Braze notification does not contain the ID for a notification channel or that a Braze notification contains an invalid channel ID, Braze will display the notification with the default notification channel defined in the SDK. Braze users use Android Notification Channels within the platform to group notifications.
To set the user facing name of the default Braze notification channel, use BrazeConfig.setDefaultNotificationChannelName()
.
To set the user facing description of the default Braze notification channel, use BrazeConfig.setDefaultNotificationChannelDescription()
.
Update any API campaigns with the Android push object parameter to include the notification_channel
field. If this field is not specified, Braze will send the notification payload with the dashboard fallback channel ID.
Other than the default notification channel, Braze will not create any channels. All other channels must be programmatically defined by the host app and then entered into the Braze dashboard.
The default channel name and description can also be configured in braze.xml
.
1
2
<string name="com_braze_default_notification_channel_name">Your channel name</string>
<string name="com_braze_default_notification_channel_description">Your channel description</string>
Step 6: Test notification display and analytics
Testing display
At this point, you should be able to see notifications sent from Braze. To test this, go to the Campaigns page on your Braze dashboard and create a Push Notification campaign. Choose Android Push and design your message. Then click the eye icon in the composer to get the test sender. Enter the user ID or email address of your current user and click Send Test. You should see the push show up on your device.
For issues related to push display, see our troubleshooting guide.
Testing analytics
At this point, you should also have analytics logging for push notification opens. Clicking on the notification when it arrives should result in the Direct Opens on your campaign results page to increase by 1. Check out our push reporting article for a break down on push analytics.
For issues related to push analytics, see our troubleshooting guide.
Testing from command line
If you’d like to test in-app and push notifications via the command-line interface, you can send a single notification through the terminal via cURL and the messaging API. You will need to replace the following fields with the correct values for your test case:
YOUR_API_KEY
(Go to Settings > API Keys.)YOUR_EXTERNAL_USER_ID
(Search for a profile on the Search Users page.)YOUR_KEY1
(optional)YOUR_VALUE1
(optional)
If you are using the older navigation, these pages are in a different location:
- API Keys is located at Developer Console > API Settings
- Search Users is located at Users > User Search
1
2
3
4
5
6
7
8
9
10
11
12
curl -X POST -H "Content-Type: application/json" -H "Authorization: Bearer {YOUR_API_KEY}" -d '{
"external_user_ids":["YOUR_EXTERNAL_USER_ID"],
"messages": {
"android_push": {
"title":"Test push title",
"alert":"Test push",
"extra": {
"YOUR_KEY1":"YOUR_VALUE1"
}
}
}
}' https://rest.iad-01.braze.com/messages/send
This example uses the US-01
instance. If you are not on this instance, replace the US-01
endpoint with your endpoint.