使用 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中

当应用程序被杀死时,FCM 不工作

当实时数据将由 FCM 更改时,我如何在 android 中获得通知?

iOS 如何在应用未运行时处理 FCM