android O中的onMessageReceived在后台应用时未调用

Posted

技术标签:

【中文标题】android O中的onMessageReceived在后台应用时未调用【英文标题】:onMessageReceived in android O not called when app in background 【发布时间】:2017-12-03 11:43:57 【问题描述】:

我正在从我的服务器发送数据有效负载通知。这是一个例子:

url= "https://fcm.googleapis.com/fcm/send"

  "to" : "userToken",
  "data" : 
    //some json here
  

以这种方式,即使应用程序没有运行,我也可以在所有预 android O 设备中成功地向用户发送消息。 但在 Android O 设备上,应用未启动时不会调用 onMessageReceived...

在 O 中有一些新规则吗?如何解决?谢谢!

更新

这个问题不是关于通知,而是关于 firebase 消息服务!

反正Android O的chanels也实现了:

val CHANEL_ID = "MY_CHANEL_ID"

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) 
    val channel = NotificationChannel(CHANEL_ID, "Channel human readable title", NotificationManager.IMPORTANCE_HIGH)
    (getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager).createNotificationChannel(channel)

【问题讨论】:

你在 manifest 中声明了服务类吗?? 当然。其他(前 O)设备成功接收到此消息 你找到解决办法了吗? @dakshbhatt21 看起来问题出在我的一加氢测试版中。当我放下它并彻底刷新手机时 - 它工作正常。 @AndriyAntonov 好的,我也会尝试并发布更新 【参考方案1】:

您需要先创建通知通道才能使用它。

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) 

      /* Create or update. */
      NotificationChannel channel = new NotificationChannel("my_channel_01",
          "Channel human readable title", 
          NotificationManager.IMPORTANCE_DEFAULT);
      mNotificationManager.createNotificationChannel(channel);
  

此外,仅当您的 targetSdkVersion 为 26 或更高时,您才需要使用通道。

如果您使用的是 NotificationCompat.Builder,您还需要更新到支持库的测试版:https://developer.android.com/topic/libraries/support-library/revisions.html#26-0-0-beta2(以便能够在兼容构建器上调用 setChannelId)。

请小心,因为此库更新将 minSdkLevel 提高到 14。

【讨论】:

谢谢,但我的 chanels 已经实现了。但还是不行【参考方案2】:

从 Android 8.0(API 级别 26)开始,通知通道允许 您可以为每种类型的用户创建一个可自定义的频道 要显示的通知。通知渠道提供了一个 统一系统,帮助用户管理通知。当你瞄准 Android 8.0(API 级别 26),必须实现一个或多个 通知渠道向您的用户显示通知。如果你 不要以 Android 8.0(API 级别 26)为目标,但您的应用用于 运行 Android 8.0(API 级别 26)的设备,您的应用的行为相同 就像在运行 Android 7.1(API 级别 25)或更低版本的设备上一样。

https://developer.android.com/guide/topics/ui/notifiers/notifications.html#ManageChannels

示例代码:

        // The id of the channel.
        String CHANNEL_ID = "my_channel_01";
        NotificationCompat.Builder mBuilder =
                new NotificationCompat.Builder(MainActivity.this).setChannel(CHANNEL_ID)
                        .setSmallIcon(R.mipmap.ic_launcher)
                        .setContentTitle("My notification")
                        .setContentText("Hello World!");
        // Creates an explicit intent for an Activity in your app
        Intent resultIntent = new Intent(this, MainActivity.class);

        // The stack builder object will contain an artificial back stack for the
        // started Activity.
        // This ensures that navigating backward from the Activity leads out of
        // your app to the Home screen.
        TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
        // Adds the back stack for the Intent (but not the Intent itself)
        stackBuilder.addParentStack(MainActivity.class);
        // Adds the Intent that starts the Activity to the top of the stack
        stackBuilder.addNextIntent(resultIntent);
        PendingIntent resultPendingIntent =
                stackBuilder.getPendingIntent(
                        0,
                        PendingIntent.FLAG_UPDATE_CURRENT
                );
        mBuilder.setContentIntent(resultPendingIntent);
        NotificationManager mNotificationManager =
                (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

        // mNotificationId is a unique integer your app uses to identify the
        // notification. For example, to cancel the notification, you can pass its ID
        // number to NotificationManager.cancel().
        mNotificationManager.notify(0, mBuilder.build());

【讨论】:

对不起,忘了说:频道已经实现了,但还是不行……【参考方案3】:

看来问题出在我的一加氢测试版上。当我放下它并彻底刷新手机时 - 它工作正常。

【讨论】:

以上是关于android O中的onMessageReceived在后台应用时未调用的主要内容,如果未能解决你的问题,请参考以下文章

为什么PendingIntent.getBroadcast()只能被静态接收器识别?

Android O 默认打开设置launcher3界面所有的APP图标LOGO形状的选项

FileObserver 在后台监听,Android O

Android深度探索(卷1)HAL与驱动开发 第七章读书心得

Android O: init进程启动流程分析(阶段一)

如何在Android java插件端等待异步操作(任何I / O)?