我正在尝试使用FCM
发送UpStream Message
,因此我按照Google上的教程进行操作。
如下面MainActivity
中的代码所示,我在点击按钮时发送Upstream message
,然后在MyAndroidFirebaseMsgService
中,我会看到Log
消息,如图所示
在MyAndroidFirebaseMsgService
下面。
但是,即使我多次按下按钮,Log
中的MyAndroidFirebaseMsgService
中的onMessageSent
消息也不会显示。
仅当Log
从MyAndroidFirebaseMsgService
发送到应用时,才能显示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
}
答案 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。