我在Android应用程序中实施FCM时遇到一个问题。
一切正常,我的服务onMessageReceived()
没有打电话。但是当我从Java服务器发送消息时,我得到了以下日志。
08-25 12:14:53.216 20482-20482/com.cognisun.sas D/ActivityThread: BDC-Calling onReceive: intent=Intent { act=com.google.android.c2dm.intent.RECEIVE flg=0x10000010 pkg=com.cognisun.sas cmp=com.cognisun.sas/com.google.firebase.iid.FirebaseInstanceIdReceiver (has extras) }, receiver=com.google.firebase.iid.FirebaseInstanceIdReceiver@ac9047a
08-25 12:14:53.222 20482-20482/com.cognisun.sas D/ActivityThread: BDC-Calling onReceive end receiver=class com.google.firebase.iid.FirebaseInstanceIdReceiver
08-25 12:14:53.223 20482-20482/com.cognisun.sas D/ActivityThread: BDC-RECEIVER handled : 0 / ReceiverData{intent=Intent { act=com.google.android.c2dm.intent.RECEIVE flg=0x10000010 pkg=com.cognisun.sas (has extras) } packageName=com.cognisun.sas resultCode=-1 resultData=null resultExtras=null}
08-25 12:14:53.223 20482-20482/com.cognisun.sas D/ActivityThread: SVC-Creating service: CreateServiceData{token=android.os.BinderProxy@750442b className=com.cognisun.sas.services.firebase.MyFirebaseMessagingService packageName=com.cognisun.sas intent=null}
08-25 12:14:53.223 20482-20482/com.cognisun.sas D/ActivityThread: SVC-CREATE_SERVICE handled : 0 / CreateServiceData{token=android.os.BinderProxy@750442b className=com.cognisun.sas.services.firebase.MyFirebaseMessagingService packageName=com.cognisun.sas intent=null}
08-25 12:14:53.224 20482-20482/com.cognisun.sas D/ActivityThread: SVC-Calling onStartCommand: com.cognisun.sas.services.firebase.MyFirebaseMessagingService@6345088, flags=0, startId=1
08-25 12:14:53.225 20482-20482/com.cognisun.sas D/ActivityThread: SVC-SERVICE_ARGS handled : 0 / ServiceArgsData{token=android.os.BinderProxy@750442b startId=1 args=Intent { act=com.google.firebase.MESSAGING_EVENT pkg=com.cognisun.sas cmp=com.cognisun.sas/.services.firebase.MyFirebaseMessagingService (has extras) }}
08-25 12:14:53.227 20482-21308/com.cognisun.sas D/SettingsInterface: from settings cache , name = cover_app_component , value = disable
08-25 12:14:53.227 20482-21308/com.cognisun.sas D/SettingsInterface: from settings cache , name = cover_app_lock , value = 0
08-25 12:14:53.232 20482-20482/com.cognisun.sas D/ActivityThread: SVC-Destroying service: com.cognisun.sas.services.firebase.MyFirebaseMessagingService@6345088
08-25 12:14:53.233 20482-20482/com.cognisun.sas D/ActivityThread: SVC-STOP_SERVICE handled : 0 / android.os.BinderProxy@750442b
任何建议????
这是我的服务类,
class MyFirebaseMessagingService : FirebaseMessagingService() {
internal var TAG = "FCM Message"
override fun onMessageReceived(remoteMessage: RemoteMessage?) {
Log.e(TAG, "From: " + remoteMessage!!.getFrom())
// Check if message contains a data payload.
if (remoteMessage.getData().size > 0) {
Log.e(TAG, "Message data payload: " + remoteMessage.getData())
}
// Check if message contains a notification payload.
if (remoteMessage.getNotification() != null) {
Log.e(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody()!!)
}
}
}
AndroidManifest.xml文件,
<service android:name=".fcm.MyFirebaseInstanceIDService"
android:exported="false">
<intent-filter>
<action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
</intent-filter>
</service>
<service android:name=".fcm.MyFirebaseMessagingService"
android:exported="false">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
我在应用程序处于后台时收到通知。如果应用程序进入前台,则会出现问题
答案 0 :(得分:2)
首先,按照this指南中的说明进行操作,它们非常简单明了,或者您可以从here克隆示例代码并自行查看错误。< / p>
其次您是否阅读了有关onMessageReceived()
// [START_EXCLUDE]
// There are two types of messages data messages and notification messages. Data messages are handled
// here in onMessageReceived whether the app is in the foreground or background. Data messages are the type
// traditionally used with GCM. Notification messages are only received here in onMessageReceived when the app
// is in the foreground. When the app is in the background an automatically generated notification is displayed.
// When the user taps on the notification they are returned to the app. Messages containing both notification
// and data payloads are treated as notification messages. The Firebase console always sends notification
// messages. For more see: https://firebase.google.com/docs/cloud-messaging/concept-options
// [END_EXCLUDE]
在此class
中查找以下评论// Also if you intend on generating your own notifications as a result of a received FCM
// message, here is where that should be initiated. See sendNotification method below.
有关详情,请参阅:https://firebase.google.com/docs/cloud-messaging/concept-options
答案 1 :(得分:2)
当您的应用在后台或被杀时,Firebase不会致电您onMessageReceived()
,并且您无法自定义您的通知。它会自动显示由Firebase管理的通知。
让Firebase库在每种情况下调用onMessageReceived()
a)前景
b)背景
c)被杀
不要放JSON密钥&#34;通知&#34;在您对Firebase API的请求中,使用&#34;数据&#34;相反,见下文。
例如,以下消息不会调用onMessageReceived()
{
"to": "/topics/test",
"notification": {
"title" : "title",
"message": "data!"
}
}
但这将有效
{
"to": "/topics/test",
"data": {
"title":"title",
"message":"data!"
}
}
看到它有firebase消息类型的详细描述例如:
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
Log.d(TAG, "From: " + remoteMessage.getFrom());
// Check if message contains a data payload.
if (remoteMessage.getData().size() > 0) {
Log.d(TAG, "Message data payload: " + remoteMessage.getData());
sendNotification(remoteMessage.getData().get("message").toString(),
remoteMessage.getData().get("title").toString());
}
}
private void sendNotification(String message, String title) {
int requestID = (int) System.currentTimeMillis();
Intent intent = new Intent(this, activityCompat);
PendingIntent pendingIntent = PendingIntent.getActivity(this, requestID, intent, PendingIntent.FLAG_UPDATE_CURRENT);
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.small_logo)
.setContentTitle(title)
.setContentText(message).setContentIntent(pendingIntent)
.setAutoCancel(true)
.setStyle(new NotificationCompat.BigTextStyle()
.bigText(messageBody))
.setTicker(messageBody);
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationBuilder.getNotification().flags |= Notification.FLAG_AUTO_CANCEL;
Notification notification = notificationBuilder.build();
notificationManager.notify(requestID, notification);
}