我在我的项目中实施了FCM。推送通知按预期工作,收到通知时调用onMessageReceived。当应用程序位于前台时,这是真的。
但是,当应用程序在后台时,系统托盘在到达时始终显示重复通知(例如,收到通知A时,系统托盘显示2通知A)
如何解决这个问题?
编辑:添加代码
我扩展了FirebaseMessagingService
课程,并在onMessageReceived
方法
这是我使用NotificationManager的项目中唯一的部分。
另外,我尝试在此方法上添加日志。当app在前台时调用onMessageReceived。当应用程序处于后台时,它不会被调用
@Override
public void onMessageReceived(RemoteMessage remoteMessage)
{
RemoteMessage.Notification notification = remoteMessage.getNotification();
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);
String title = notification.getTitle();
String message = notification.getBody();
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle(title)
.setContentText(message)
.setAutoCancel(true)
.setDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE)
.setContentIntent(pendingIntent);
NotificationManager notificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(0, notificationBuilder.build());
}
答案 0 :(得分:3)
同样的问题。我修改了AndroidManifest.xml,因为我正在请求旧GCM的权限......
<uses-permission android:name="mypackage.permission.C2D_MESSAGE" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<permission
android:name="mypackage.permission.C2D_MESSAGE"
android:protectionLevel="signature" />
所以,将它从清单中删除并卸载并重新安装应用程序我的问题就解决了。
答案 1 :(得分:3)
要手动处理推送通知,请使用 FirebaseMessagingService 的 handleIntent(intent)。 当应用程序处于前台,后台和被杀死状态时,将调用此方法。为避免重复,请不要调用 super.handleIntent(intent)。当应用程序处于BG或被杀死状态时,这将阻止自动推送通知。
这对我有用。
答案 2 :(得分:0)
我遇到了完全相同的“重复”问题。这可能只是一种解决方法,因为当应用程序处于前台而没有发生“重复”问题时,我无法获得通知。相反,我实现了一个WakefulBroadcastReceiver,当切换android:导出为“false”时,它开始表现。
AndroidManifest.xml
<receiver
android:name="PACKAGE.MyWakefulBroadcastReceiver"
android:exported="false">
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
</intent-filter>
</receiver>
MyWakefulListenerService.java
public class MyWakefulBroadcastReceiver extends WakefulBroadcastReceiver {
private final String TAG = "MyWakefulListener";
public void onReceive(Context context, Intent intent) {
sendNotification(context);
}
}