不会相应地调用FirebaseMessagingService的onMessageSent

时间:2017-07-20 09:48:32

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

我正在尝试使用FCM发送UpStream Message,因此我按照Google上的教程进行操作。

如下面MainActivity中的代码所示,我在点击按钮时发送Upstream message,然后在MyAndroidFirebaseMsgService中,我会看到Log消息,如图所示 在MyAndroidFirebaseMsgService下面。

但是,即使我多次按下按钮,Log中的MyAndroidFirebaseMsgService中的onMessageSent消息也不会显示。 仅当LogMyAndroidFirebaseMsgService发送到应用时,才能显示onMessageSent downstream message中的FCM消息,在这种情况下,Logs在...中 将显示MyAndroidFirebaseMsgService

请告诉我为什么onMessageSent发送了UpStream message后才会显示protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mBtnSendUpstreamMsg = (Button) findViewById(R.id.btn_send_upstream_message); mBtnSendUpstreamMsg.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { FirebaseMessaging fm = FirebaseMessaging.getInstance(); fm.send(new RemoteMessage.Builder("673xxxxx" + "@gcm.googleapis.com") .setMessageId("2") .addData("my_message", "Hello World") .addData("my_action","SAY_HELLO") .build()); } }); } 中的日志消息?以及如何修复它。

Mainactivity

public class MyAndroidFirebaseMsgService extends FirebaseMessagingService {
private final static String TAG = MyAndroidFirebaseMsgService.class.getSimpleName();

@Override
public void onMessageSent(String s) {
    super.onMessageSent(s);
    Log.d(TAG, "onMessageSent: upstream message");
}

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    Log.d(TAG, "onMessageReceived: downstream message");
    //Log data to Log Cat
    Log.d(TAG, "onMessageReceived->From: " + remoteMessage.getFrom());
    Log.d(TAG, "onMessageReceived->Notification Message Body: " + remoteMessage.getNotification().getBody());
    //create notification
    createNotification(remoteMessage.getNotification().getBody());
}

private void createNotification( String messageBody) {
    Intent intent = new Intent( this , ResultActivity.class );
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    PendingIntent resultIntent = PendingIntent.getActivity( this , 0, intent,
            PendingIntent.FLAG_ONE_SHOT);

    Uri notificationSoundURI = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    NotificationCompat.Builder mNotificationBuilder = new NotificationCompat.Builder( this)
            .setSmallIcon(R.mipmap.ic_launcher)
            .setContentTitle("Android Tutorial Point FCM Tutorial")
            .setContentText(messageBody)
            .setAutoCancel( true )
            .setSound(notificationSoundURI)
            .setContentIntent(resultIntent);

    NotificationManager notificationManager =
            (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

    notificationManager.notify(0, mNotificationBuilder.build());
}

MyAndroidFirebaseMsgService

name

}

1 个答案:

答案 0 :(得分:0)

是的,可以使用onMessageReceived发送Firebase消息推送通知并在所有应用程序生命周期中接收它。

但是有必要更改默认的Firebase行为,先拦截意图请求。


** 重要提示 **

这是Firebase的愚蠢想法,方法是在FCM消息以notification message格式到达时(而不是data message删除FCM消息时,取消开发人员的处理能力)。

这在许多解决方案中创建了许多“ 解决方法”,这使得分析学和其他所有问题都被弄乱了。

如果我已经设计了此解决方案,那么我总是会用onMessageReceived来调用completion handle方法。让开发人员决定该怎么做(免费的提示,Firebase)。

使用onMessageReceived是正确的方法。此方法是唯一带来RemoteMessage对象的人,该对象具有所需的所有信息。它是专为此设计的。您在正确的路径上。


** 如何做 **

在扩展了MyAndroidFirebaseMsgService的Firebase类FirebaseMessagingService中,重写公共方法handleIntent以便在Firebase捕获意图请求之前对其进行拦截。

    @Override
    public void handleIntent(Intent intent){

        if(intent.hasExtra("google.message_id")){
            intent = handleFirebaseIntent(intent);
        }

        super.handleIntent(intent);
    }

之后,将notification message包转换为data message,从意图中删除所有"gcm.notification.%""gcm.n.%"的多余内容,并翻译"gcm.notification.title",{{1} }和"gcm.notification.body"元素添加到您需要的内容中:

"gcm.notification.image"

您可以选中my entire solution here