プロジェクトにFCMを実装しました。プッシュ通知は期待どおりに機能しており、通知を受信するとonMessageReceivedが呼び出されます。これは、アプリがフォアグラウンドにある場合に当てはまります。
ただし、アプリがバックグラウンドにある場合、システムトレイには、到着時に常に重複した通知が表示されます(たとえば、通知Aを受信すると、システムトレイに2つの通知Aが表示されます)
これを修正する方法は?
編集:追加されたコード
FirebaseMessagingService
クラスを拡張し、これをonMessageReceived
メソッドに入れました
これは、私がNotificationManagerを使用したプロジェクトの唯一の部分です。
また、このメソッドにログを追加しようとしました。 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());
}
同じ問題。このように古いGCMへのアクセス許可を要求していたため、AndroidManifest.xmlを変更しました...
<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" />
それで、マニフェストからそれを削除し、アプリをアンインストールして再インストールすると、私の問題は解決しました。
プッシュ通知を手動で処理するには、handleIntent(intent) of FirebaseMessagingServiceを使用します。このメソッドは、アプリケーションがフォアグラウンド、バックグラウンド、および強制終了状態にあるときに呼び出されます。重複を避けるために、super.handleIntent(intent)を呼び出さないでください。これにより、アプリがBGまたは強制終了状態の場合の自動プッシュ通知が防止されます。
これは私のために働いた。
私はまったく同じ「重複」問題を抱えていました。 「重複」の問題が発生せずにアプリがフォアグラウンドにあるときに動作する通知を受け取ることができなかったため、これは単なる回避策である可能性があります。代わりに、WakefulBroadcastReceiverを実装しました。Android:exportedを「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);
}
}