简体   繁体   中英

Not show push notification (Firebase Cloud Message) on status bar when app is not running

in AndroidManifest.xml

 <service
        

android:name=".CustomFirebaseInstanceIDService"
        android:exported="true">
        <intent-filter>
            <action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
        </intent-filter>
    </service>


    <service
        android:name=".CustomFirebaseMessagingService"
        android:exported="false">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT" />
        </intent-filter>
    </service>

My service:

import android.util.Log
import com.google.firebase.messaging.FirebaseMessagingService
import com.google.firebase.messaging.RemoteMessage
import org.tokend.template.BuildConfig

class CustomFirebaseMessagingService : FirebaseMessagingService() {
    override fun onMessageReceived(remoteMessage: RemoteMessage?) {
        if (remoteMessage?.data?.isNotEmpty()!!) {
            val payloadData: Map<String, String> = remoteMessage.data
            PushNotificationService.showNotification(applicationContext, payloadData["title"]!!, payloadData["body"]!!)
        }

        // Check if message contains a notification payload.
        remoteMessage.notification?.let {
            val notificationTitle : String? = it.title
            val notificationBody: String? = it.body
            PushNotificationService.showNotification(applicationContext, notificationTitle!!, notificationBody!!)
        }
    }

And show push:

object PushNotificationService {
    val TAG = PushNotificationService::class.java.name
    val CHANNEL_ID = "channelId"
    val NOTIFICATON_ID = 1

    fun showNotification(context: Context, title: String, body: String) {
        val intent = Intent(context, SignInActivity::class.java).apply {
            this.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
        }
        val pendingIntent: PendingIntent = PendingIntent.getActivity(context, 0, intent, 0)

        val builder = NotificationCompat.Builder(context, CHANNEL_ID)
                .setSmallIcon(R.mipmap.ic_launcher)
                .setLargeIcon(BitmapFactory.decodeResource(context.getResources(),
                        R.mipmap.ic_launcher))
                .setContentTitle(title)
                .setStyle(NotificationCompat.BigTextStyle().bigText(body))
                .setPriority(NotificationCompat.PRIORITY_DEFAULT)
                // Set the intent that will fire when the user taps the notification
                .setContentIntent(pendingIntent)
                .setAutoCancel(true)

        // Show the notification
        with(NotificationManagerCompat.from(context), {
            // NOTIFICATON_ID is a unique int for each notification that you must define
            this.notify(NOTIFICATON_ID, builder.build())
        })
    }

So:

  1. when server send data or notification and application is run and foreground then method onMessageReceived success call and success show push notification (title and body) in the status bar (on top)

  2. when server send data or notification and application is run and minimize then method onMessageReceived success call and success show push notification in the status bar (on top)

  3. But when server send data or notification and application is NOT RUNNING then not call method onMessageReceived and also not show push notification on the status bar.

But I need to show push notification on the status bar when app is not running.

I send data message to my android device by Python script:

import firebase_admin, sys
from firebase_admin import credentials, messaging
message = messaging.Message(
    data={
        "title": "Test data",
        "body": "Body of long test text of data test long body message for type data"
    },
    token=sys.argv[1],
)

response = messaging.send(message)

PS If I send message from Firebase console then success show push notification on status bar when app is not running.

Try to only send data payload (without notification payload) it should always call onMessageReceived . Also try adding priority (my.js example):

const  payload = {
        data: {
            title: 'finalTitle',
            body: 'message',
        },
        android:{
            priority: 'high'
            },
        topic: channel
    };

    admin.messaging().send(payload)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM