使用 FCM 杀死应用程序时,Android 无法接收通知
Posted
技术标签:
【中文标题】使用 FCM 杀死应用程序时,Android 无法接收通知【英文标题】:Android unable to receive notification when app is killed using FCM 【发布时间】:2021-03-08 11:26:30 【问题描述】:android 能够在应用程序处于前台和后台时接收通知,但是当我杀死它导致无法接收通知时。
我不确定哪一部分出了问题。
AndroidManifest.xml 中的代码
<service
android:name=".MyFirebaseMessagingService"
android:exported="false">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
MyFirebaseMessagingService.java
我没有为刷新令牌创建 MyFirebaseIdService.java。我在这个类中使用 onNewToken(String mToken) 代替。
public class MyFirebaseMessagingService extends FirebaseMessagingService
@Override
public void onNewToken(String mToken)
super.onNewToken(mToken);
Log.e("NEW_TOKEN",mToken);
这是我的 onMessageReceived 代码。
@Override
public void onMessageReceived(RemoteMessage remoteMessage)
super.onMessageReceived(remoteMessage);
Log.d(TAG, "From: " + remoteMessage.getFrom());
RemoteMessage.Notification notification = remoteMessage.getNotification();
Map<String, String> data = remoteMessage.getData();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
sendNotification(notification, data);
sendNotification 代码,我尝试让它同时接收数据负载和通知负载,但它仍然无法正常工作。
@RequiresApi(api = Build.VERSION_CODES.O)
private void sendNotification(RemoteMessage.Notification notification, Map<String, String> data)
String title;
String body;
if (data != null)
title = data.get("title");
body = data.get("body");
else
title = notification.getTitle();
body = notification.getBody();
Bitmap icon = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);
Intent intent = new Intent(this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT);
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this, "channel_id")
.setContentTitle(title)
.setContentText(body)
.setAutoCancel(true)
.setPriority(NotificationCompat.PRIORITY_HIGH)
.setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION))
.setContentIntent(pendingIntent)
.setLargeIcon(icon)
.setColor(Color.BLUE)
.setSmallIcon(R.mipmap.ic_launcher);
try
String picture_url = data.get("picture_url");
if (picture_url != null && !"".equals(picture_url))
URL url = new URL(picture_url);
Bitmap bigPicture = BitmapFactory.decodeStream(url.openConnection().getInputStream());
notificationBuilder.setStyle(
new NotificationCompat.BigPictureStyle().bigPicture(bigPicture).setSummaryText(notification.getBody())
);
catch (IOException e)
e.printStackTrace();
notificationBuilder.setDefaults(Notification.DEFAULT_VIBRATE);
notificationBuilder.setLights(Color.RED, 1000, 300);
NotificationManagerCompat managerCompat = NotificationManagerCompat.from(this);
创建频道代码
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
NotificationChannel channel = new NotificationChannel(
"channel_id", "channel_name", NotificationManager.IMPORTANCE_DEFAULT
);
channel.setDescription("channel description");
channel.setShowBadge(true);
channel.canShowBadge();
channel.enableLights(true);
channel.setLightColor(Color.RED);
channel.enableVibration(true);
channel.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE);
channel.setVibrationPattern(new long[]100, 200, 300, 400, 500);
managerCompat.createNotificationChannel(channel);
managerCompat.notify(101,notificationBuilder.build());
【问题讨论】:
您希望我们帮助您只放置您的代码。告诉你的成就,你当前的问题,如果你注意到你的代码的一部分是正确的 谢谢,我已经在编辑了。 您是否在不同的设备上尝试过您的代码?你在模拟器上测试过吗? 是的,它根本不起作用。 【参考方案1】:当应用程序因某种原因被杀死时,您无法收到通知:
一些制造商,如华为、OPPO ecc... 在应用程序未运行时无法推送通知,这是为了节省您的电池寿命。当然,重要的应用程序(WhatsApp、Instagram ecc...)默认情况下会例外。另一方面,有一种方法可以解决它,每个应用程序都可以通过设置->电池手动获取此权限(它通过电话更改手机)。
现在您必须找到此权限,该权限使应用程序无需运行即可推送通知。提示:当我勾选这个时,它不起作用;我不得不通过设置->应用程序卸载应用程序,然后重新安装它
【讨论】:
我认为这无关。您的应用无需运行即可接收云消息。 应用程序被杀死时他没有收到通知,我遇到了这个问题并以这种方式修复。可能我没看懂他的成就以上是关于使用 FCM 杀死应用程序时,Android 无法接收通知的主要内容,如果未能解决你的问题,请参考以下文章
如何在 ios 中单击通知时接收数据,当应用程序被杀死时,(react-native-fcm 模块在 IOS 中获取推送通知)
在应用程序被杀死后,使用 HTTP 请求通过 Firebase(FCM)向 iOS 设备发送推送通知 [重复]
oppo,vivo应用程序终止通知没有出现在android fcm中