当活动在后台或不在后台时,Firebase通知无效

时间:2016-09-16 10:32:46

标签: android firebase push-notification firebase-cloud-messaging

我有与firebase示例代码提供的相同的编码。当活动处于前台状态或打开时,它可以正常工作。但是当活动关闭或处于后台状态时,它将无法正常工作。问题是那样......

  1. 应用程序未显示应用程序图标。

  2. 默认情况下,将应用名称作为通知标题

  3. 当应用程序处于后台状态或未在设备上打开时发生通知时,LogCat会显示以下详细信息:

    09-16 15:55:56.056 12113-12113/com.testdemofb D/FirebaseApp: com.google.firebase.auth.FirebaseAuth is not linked. Skipping initialization.
    09-16 15:55:56.089 12113-12113/com.testdemofb D/FirebaseApp: com.google.firebase.crash.FirebaseCrash is not linked. Skipping initialization.
    09-16 15:55:56.176 12113-12113/com.testdemofb I/FA: App measurement is starting up, version: 9452
    09-16 15:55:56.177 12113-12113/com.testdemofb I/FA: To enable debug logging run: adb shell setprop log.tag.FA VERBOSE
    09-16 15:55:56.286 12113-12113/com.testdemofb I/FirebaseInitProvider: FirebaseApp initialization successful
    09-16 15:55:56.518 12113-12147/com.testdemofb I/FA: Tag Manager is not found and thus will not be used
    

    如果有任何解决方案,那么帮助我

    ...谢谢

    MyFirebaseMessagingService.java

    package com.testdemofb;
    
    import android.app.Notification;
    import android.app.NotificationManager;
    import android.app.PendingIntent;
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.graphics.Color;
    import android.media.RingtoneManager;
    import android.net.Uri;
    import android.support.v4.app.NotificationCompat;
    import android.util.Log;
    import android.widget.Toast;
    
    import com.google.firebase.messaging.FirebaseMessagingService;
    import com.google.firebase.messaging.RemoteMessage;
    
    public class MyFirebaseMessagingService extends FirebaseMessagingService {
    
    private static final String TAG = "MyFirebaseMsgService";
    
    
    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
    
        // Check if message contains a data payload.
        if (remoteMessage.getData().size() > 0) {
            Log.d(TAG, "Message data payload: " + remoteMessage.getData());
            sendNotification(remoteMessage.getData().get("title"));
        }
    
        // Check if message contains a notification payload.
        if (remoteMessage.getNotification() != null) {
            Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody());
            Log.d(TAG, "Message Notification BodyLocalize: " + remoteMessage.getNotification().getBodyLocalizationKey());
            Log.d(TAG, "Message Notification Title: " + remoteMessage.getNotification().getTitle());
            Log.d(TAG, "Message Notification TitleLocalize: " + remoteMessage.getNotification().getTitleLocalizationKey());
            sendNotification(remoteMessage.getNotification().getBody());
        }
    
    
    }
    
    private void sendNotification(String messageBody) {
        Intent intent = new Intent(this, MainActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
                PendingIntent.FLAG_ONE_SHOT);
    
        Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        Bitmap bm = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);
        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
                .setLargeIcon(bm)
                .setSmallIcon(R.mipmap.ic_launcher)
                .setContentTitle("Title")
                .setContentText(messageBody)
                .setAutoCancel(true)
                .setSound(defaultSoundUri)
                .setContentIntent(pendingIntent);
    
        NotificationManager notificationManager =
                (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    
        notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
    
    }
    }
    

    AndroidManifest.xml文件在 application 标记...

    之间放置
        <service android:name=".MyFirebaseMessagingService"
            android:process="remote">
            <intent-filter>
                <action android:name="com.google.firebase.MESSAGING_EVENT" />
            </intent-filter>
        </service>
    
        <service android:name=".MyFirebaseInstanceIDService" >
            <intent-filter>
                <action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
            </intent-filter>
        </service>
    

3 个答案:

答案 0 :(得分:2)

FCM使用两种类型的消息,即。通知和数据。阅读更多相关信息here。我想你正在发送通知。您需要发送数据消息。

像这样。

{
"to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
   "data" : {
 "Nick" : "Mario",
 "body" : "great match!",
 "Room" : "PortugalVSDenmark"
},
}

答案 1 :(得分:0)

从Firebase控制台发送通知:适用于后台和前台应用

取代onMessageReceived,覆盖FirebaseMessagingService的zzm()并从此处创建自定义通知

@Override
public void zzm(Intent intent) {
    Log.e(TAG, "zzm : " + intent);
    createNotification();        
}

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {

}

答案 2 :(得分:-3)

我认为FireBase的工作原理如下......

enter image description here