LogoLogo
My AppsLive demoNewsArticles
  • Introduction
  • 📌Product updates: 2025
    • 2024
    • 2023
  • Getting Started
    • Registration
    • Adding a space
    • Adding an app to the space
  • Basic Events & Custom Events
  • Integration
    • Expert Tips
      • What to track
      • Payments & Anti-cheat
      • Check your integration
    • Integration of SDK 2.0+
      • SDK Integration
        • Android
        • iOS
        • macOS
        • Windows
        • Web
          • Web SDK Integration
          • Web SDK Releases
        • Unity
        • Unreal Engine
        • Godot Engine
      • Automatic payment tracking
        • App Store
        • Google Play
      • Setting up Events
        • Basic methods
        • Secondary methods
        • User profile
        • Anticheat methods
        • Track sessions
      • Push notifications
        • Android
        • iOS
        • Windows (UWP)
        • Unity
          • Android
          • iOS
          • Windows (UWP/WSA)
        • Unreal Engine
      • A/B testing
        • Description of A/B testing on the SDK side
        • Working with A/B tests in the devtodev interface
        • A/B testing examples
    • Integration of SDK 1.0+ (deprecated)
      • SDK Integration
        • iOS
        • Android
        • Windows 8.1 and 10
        • Web
        • Unity
        • Mac OS
        • Adobe Air
        • UE4
      • Setting up Events
        • Basic methods
        • Secondary methods
        • User profile
        • Anti-cheat Methods
      • Push Notifications
        • IOS
        • Android
        • Windows 8.1 and Windows 10
        • Unity
        • Abode Air
        • UE4
    • Test Devices
    • Server API
      • Data API 2.0
      • Subscription API
      • Push API
        • IOS
        • Android
        • Windows UWP
        • Windows
      • Raw Export
      • Labels API
      • Data API
    • Import historical data via API
    • Data Export
      • Data Export to Cloud Storage (BigQuery / Amazon S3)
  • 3rd Party Sources
    • Attribution Trackers
      • AppsFlyer
      • Adjust
      • Branch.io
      • Kochava
      • Tenjin
      • Tune (MAT)
      • Singular
      • Custom postback API
      • Facebook Ads referral decryption
    • App Marketplace Data
      • App Store Connect Stats
      • App Store Subscriptions
      • Google Play Console Stats
      • Google Play Subscriptions
      • AppGallery Connect Stats
    • Ad revenue
      • AdColony
      • AdMob
      • Facebook
      • MoPub
      • Unity Ads
      • Vungle
      • Ad revenue API
    • Cohort export
  • Reports and Functionality
    • Space-related Reports and Functionality
      • Overview
      • Custom dashboards & Reports
      • SQL
        • SQL tips
        • SQL Query examples
      • Audience overlap
    • Project-related Reports and Functionality
      • Overview
        • Real-Time Dashboard
        • Acquisition reports
        • Engagement reports
        • Monetization reports
        • In-game analysis reports
        • Cohort analysis
      • Reports
      • Push Notifications
        • Android Notifications
        • IOS Notifications
        • Windows Notifications
        • Button Templates
      • Predictions
      • Users & Segments
      • Filters
      • A/B Testing
      • Tuning
      • Settings
  • Metrics and Glossary
    • Ad networks metrics
    • Market Metrics
    • Prediction Metrics
    • SDK Metrics
    • Subscription metrics
  • Space Management
  • User Profile Management
  • Limits
  • Scenarios and Best Practices
    • Analytics use cases
    • Match-3
    • MMORPG Games
    • Hyper-Casual games
    • Social Casino
    • RPG games
    • Farming games
    • Non-gaming app
    • Acquisition Example
  • FAQ
    • Identification
    • Raw Data
    • All about data discrepancies
  • Slack
Powered by GitBook
On this page
  • How to create a project in Firebase and integrate Firebase Services into your application
  • Messaging Module Integration
  • Android 13 or higher
  • External interface of the DTDMessaging module
  • DTDPushListener Interface Methods
  • A Class for Receiving Notification Data (DTDPushMessage).
  • A Class for Handling the Notification Button Taps (DTDActionButton)

Was this helpful?

Export as PDF
  1. Integration
  2. Integration of SDK 2.0+
  3. Push notifications

Android

Android Push Notifications

PreviousPush notificationsNextiOS

Last updated 18 days ago

Was this helpful?

How to create a project in Firebase and integrate Firebase Services into your application

Push Notifications on Android are sent with the help of the FCM service.

Register and open the project creation window in Firebase.

Click Add project.

Write the name of your project. At this stage, you can also set your own unique project identifier or use the one that Firebase will generate for you automatically.

After creating the project card, create an Android application by clicking on the Android icon.

Register your android package name.

Download the google-services.json file and use it according to the instructions of firebase.

Add firebase dependencies according to the firebase documentation.

Complete the application registration, you will see the project overview section.

Select your application by clicking on it, you will see a gear on the right side, click on it to go to project settings.

Go to the cloud messages section, make sure that the Firebase Cloud Messaging API (V1) is active (if not, activate it).

Go to the general section and copy the value of the Project ID field and paste it into the devtodev web interface.

The Project ID is also available from the Firebase main screen in the project cards. After setting up the application, the card should look like this:

It should have a Project ID and an android icon.

Next, open the push notifications integration settings panel in the application settings section in devtodev service (App → Settings → Push notifications → Push notifications panel). Push edit button (pencil symbol).

You will need to specify the Firebase Project ID and authorize devtodev to send messages and manage messaging subscriptions for your Firebase application. To authorise the application, you must use Google login and password of a user with sufficient access rights to the project on Firebase. After that click Save button.

Messaging Module Integration

1. If you use Gradle for the applications build, add mavenCentral() into gradle.build file of your application and specify the following relationship in dependencies block:

defaultConfig {
    //other existing fields 
    versionName = "1.0" //your app version (required)
}

dependencies {
    // Requirement
    implementation("androidx.appcompat:appcompat:*.*.*")
    implementation("com.google.code.gson:gson:*.*.*")
    implementation("com.google.firebase:firebase-messaging:*.*.*")
    implementation("com.google.android.gms:play-services-ads-identifier:*.*.*")
    
    // if you use AAR (recommended) or JAR downloaded from GitHub, please add:
    implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.aar"))))
    
    // or just add the dependency, get the latest version from
    // https://mvnrepository.com/artifact/com.devtodev/android-analytics
    implementation("com.devtodev:android-analytics:*.*.*")
    // https://mvnrepository.com/artifact/com.devtodev/android-messaging
    implementation("com.devtodev:android-messaging:*.*.*")
    
    // Optional (recommended)
    implementation("com.android.installreferrer:installreferrer:*.*")
}
defaultConfig {
    //other existing fields 
    versionName "1.0" //your app version (required)
}

dependencies {
    // Requirement
    implementation 'androidx.appcompat:appcompat:*.*.*'
    implementation 'com.google.code.gson:gson:*.*.*'
    implementation 'com.google.android.gms:play-services-ads-identifier:*.*.*'
    implementation 'com.google.firebase:firebase-messaging:*.*.*'
    
    // if you use AAR (recommended) or JAR downloaded from GitHub, please add:
    implementation fileTree(dir: "libs", include: ["*.aar"]) 
    
    // or just add the dependency, get the latest version from
    // https://mvnrepository.com/artifact/com.devtodev/android-analytics
    implementation 'com.devtodev:android-analytics:*.*.*'
    // https://mvnrepository.com/artifact/com.devtodev/android-messaging
    implementation 'com.devtodev:android-messaging:*.*.*'
    
    // Optional (recommended)
    implementation 'com.android.installreferrer:installreferrer:*.*'
}

2. To the app manifest add the following:

<!-- permission.POST_NOTIFICATIONS for API level 33 or higher -->
<uses-permission android:name=“android.permission.POST_NOTIFICATIONS”/>

<application>
        <service
            android:name="com.devtodev.push.internal.logic.DTDFcmMessagingService"
            android:exported="true">
            <intent-filter>
                <action android:name="com.google.firebase.MESSAGING_EVENT"/>
            </intent-filter>
        </service>

        <receiver
            android:name="com.devtodev.push.internal.logic.PushClickReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="com.devtodev.android.push.CLICKED" />
            </intent-filter>
        </receiver>
</application>

3. To add a user icon to your push notification and change its color, add the following strings to the manifest file code:

<meta-data
 android:name="com.devtodev.push.default_small_icon"
 android:resource="@drawable/ic_icon_name" />

<meta-data
 android:name="com.devtodev.push.default_small_icon_color"
 android:resource="@color/icon_color" />

To add a large user icon to your push notifications, add:

<meta-data
android:name="com.devtodev.push.default_large_icon"
android:resource="@mipmap/ic_large_icon_name"/>

Example:

<application
    <!-- Your tags -->
    <service
        android:name="com.devtodev.push.internal.logic.DTDFcmMessagingService">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT" />
        </intent-filter>
    </service>

    <receiver
        android:name="com.devtodev.push.internal.logic.PushClickReceiver"
        android:enabled="true"
        android:exported="true">
        <intent-filter>
            <action android:name="com.devtodev.android.push.CLICKED" />
        </intent-filter>
    </receiver>

    <meta-data
        android:name="com.devtodev.push.default_small_icon"
        android:resource="@drawable/ic_baseline" />

    <meta-data
        android:name="com.devtodev.push.default_small_icon_color"
        android:resource="@color/colorPrimary" />

    <meta-data
        android:name="com.devtodev.push.default_large_icon"
        android:resource="@mipmap/baseline_accessibility_black_18"/>
</application>

4. After the DTDAnalytics initializer, add the DTDMessaging initializer.

Example:

val analyticsConfiguration = DTDAnalyticsConfiguration()
analyticsConfiguration.logLevel = DTDLogLevel.Error

DTDAnalytics.initialize(
    appKey = "projectKey",
    analyticsConfiguration = analyticsConfiguration,
    context = this
)
DTDMessaging.initialize(context = this)
DTDAnalyticsConfiguration analyticsConfiguration = new DTDAnalyticsConfiguration();
analyticsConfiguration.setLogLevel(DTDLogLevel.Error);
DTDAnalytics.INSTANCE.initialize("projectKey",analyticsConfiguration,context);
DTDMessaging.INSTANCE.initialize(context);

5. Subscribe a DTDPushListener to receive information about the DTDMessaging functioning.

Example:

DTDMessaging.setPushListener(object : DTDPushListener {
      override fun onPushServiceRegistrationSuccessful(deviceId: String) {
          //do something
      }
      override fun onPushServiceRegistrationFailed(error: String) {
          //do something
      }
      override fun onPushNotificationReceived(message: Map<String, String?>?) {
          //do something
      }
      override fun onPushNotificationOpened(pushMessage: DTDPushMessage, actionButton: DTDActionButton?) {
          //do something
      }
})
DTDMessaging.INSTANCE.setPushListener(new DTDPushListener() {
    @Override
    public void onPushServiceRegistrationSuccessful(@NonNull String deviceId) {
        //do something            
    }

    @Override
    public void onPushServiceRegistrationFailed(@NonNull String error) {
        //do something
    }

    @Override
    public void onPushNotificationReceived(@Nullable Map<String, String> message) {
        //do something
    }

    @Override
    public void onPushNotificationOpened(@NonNull DTDPushMessage dtdPushMessage, @Nullable DTDActionButton dtdActionButton) {
        //do something
    }
});

6. Call the DTDMessaging.startPushService() method to activate the Messaging module.

Android 13 or higher

When using Android 13 or higher, notifications are disabled by default. The app won’t receive notifications until you request a new permission (POST_NOTIFICATIONS) and the user grants this permission to your app.

For notifications to work properly, add the following line to the manifest file:

<uses-permission android:name=“android.permission.POST_NOTIFICATIONS”/>

You can check the operation of the POST_NOTIFICATIONS permission in your app by inserting this example in the code:

@RequiresApi(33)
private fun notificationPermissionIsGranted(): Boolean {
    val res = context.checkCallingOrSelfPermission(POST_NOTIFICATIONS)
    return res == PackageManager.PERMISSION_GRANTED
}
@RequiresApi(33)
private Boolean notificationPermissionIsGranted() {
    int res = context.checkCallingOrSelfPermission(POST_NOTIFICATIONS);
    return res == PackageManager.PERMISSION_GRANTED;
}

If the check results in a negative answer (access is not granted), call this method:

requestPermissions(arrayOf(Manifest.permission.POST_NOTIFICATIONS), yourCode)
String[] permissionsArr = {Manifest.permission.POST_NOTIFICATIONS};
requestPermissions(permissionsArr, yourCode);

Its execution will call a dialog that in turn will ask the user to opt in:

This code is going to help you get the user’s decision:

override fun onRequestPermissionsResult(
    requestCode: Int,
    permissions: Array<String?>,
    grantResults: IntArray
) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults)
    if (requestCode == yourCode) {
        if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            //permission is granted
        } else {
            //permission is not granted, notifications are not available
        }
    }
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == yourCode) {
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            //permission is granted
        } else {
            //permission is not granted, notifications are not available
        }
    }
}

Note. In SDK ver. 2.1.5 or higher, if the permission is not granted, you will see this message in the log from DTDMessaging: “Notifications don’t work. Permission android.permission.POST_NOTIFICATIONS is not granted”.

External interface of the DTDMessaging module

Object

Description

DTDMessaging

The main object for push notification initialization.

DTDMessaging.initialize(Context context)

The push notification initialization method.

DTDMessaging.startPushService()

The push notification activation method. It passes the isAllowed current state.

DTDMessaging.pushNotificationsAllowed = true or false

A property responsible for the activation/deactivation of push notifications.

Functions as a getter (describes the current state) and a setter (sets the current state).

When the state transitions, it sends a pt with isAllowed (true or false) status to the server.

The isAllowed flag status is stored in the SDK.

DTDMessaging.setIntent(Intent intent)

A method of passing a user intent to the SDK using PushMessage.

Written in the manifest file <meta-data android:name="com.devtodev.push.default_small_icon" android:resource="@drawable/smallIcon" />

Sets a small custom user icon.

Written in the manifest file <meta-data android:name="com.devtodev.default_small_icon_color" android:resource="@color/colorPrimary" />

Sets a color of the small custom user icon.

Written in the manifest file <meta-data android:name="com.devtodev.push.default_large_icon" android:resource="@mipmap/largeIcon" />

Sets a large custom user icon.

DTDMessaging.getToken()

Returns a push notification registration token (firebaseToken).

DTDMessaging.processPushNotification(Context context, RemoteMessage remoteMessage)

Used to pass the push notification to the FirebaseMessagingService if it was implemented by the client but not by the SDK.

DTDMessaging.setPushListener(DTDPushListener pushListener)

(DTDPushListener pushListener) - sets a listener for push notification event trapping.

DTDPushListener Interface Methods

DTDPushListener Interface Methods

Description

onPushServiceRegistrationSuccessful(String deviceId)

Returns a push notification registration token (firebaseToken).

onPushServiceRegistrationFailed(String error)

Returns errors during push notification registration.

onPushNotificationReceived(Map<String, String> message)

Returns a directory with data for improving your push notifications.

onPushNotificationOpened(DTDPushMessage pushMessage, @Nullable DTDActionButton actionButton)

Returns pushMessage and actionButton if they were tapped.

A Class for Receiving Notification Data (DTDPushMessage).

Basic Class Properties

Property

Type

Description

getData()

Map<String, String>

Complete information sent with the use of a remote push notification.

systemId

Int

The notification ID used in the devtodev system.

getTitle(context:Context)

String?

Returns the selected message title or app name if the former is unavailable.

body

String?

The text body.

group

String?

A group of messages.

getSound(context: Context)

Uri?

Returns the storage path of an audio file.

getSoundName()

String?

The notification sound name.

tag

String?

The notification tag.

color

String?

The notification color.

bigPicture

String?

The notification banner if specified.

actionType

DTDActionType

The property that returns an enum’s DTDActionType value.

Possible values:

  • Url - an external link opening

  • Share - content sharing

  • Deeplink - an in-app link opening

actionString

String?

The property that returns an optional action ID.

getIcon(context: Context, userIcon: Int)

Int

The icon resource identifier specified by the user (if specified).

largeIcon

String?

The large notification icon name.

actions

List<DTDActionButton>

The list of action buttons used in the push notification.

isApiSource

Boolean

Specifies whether the push notification was sent using the devtodev API.

A Class for Handling the Notification Button Taps (DTDActionButton)

Property

Type

Description

Id

String?

The property that returns the tapped button ID.

actionString

String?

The property that returns the optional action ID.

actionType

DTDActionType

The property that returns an enum’s DTDActionType value.

Possible values:

  • App - a default value

  • Url - an external link opening

  • Share - content sharing

  • Deeplink - an in-app link opening

icon

String?

The property that returns the button’s icon name.

isBackground

Boolean

The button-click app open mode.

text

String?

The property that returns the text of the tapped button.

The Messaging module is available as an AAR (recommended) and JAR library. The library is available in the MavenCentral and .

GitHub repository