【问题标题】:Android Firebase MyFirebaseMessagingService not called when app is swiped from recent list从最近的列表中滑动应用程序时未调用 Android Firebase MyFirebaseMessagingService
【发布时间】:2017-02-03 16:40:54
【问题描述】:

2016 年 11 月 24 日编辑: 我刚刚收到 Firebase 支持的消息。他们认为这是华硕的问题。我使用的设备是华硕 ZenFone 2 Laser。这是他们的回应:

这里的问题是 Google 无法控制制造商如何 自定义他们的 android 版本。如果华硕跟随安卓 指导方针,然后通知应该工作(就像在其他 设备)。

我们发现的一件事是一些手机将应用程序强制停止 状态,这会阻止应用接收通知。

从您的测试结果来看,情况似乎并非如此。但这有 华硕可以阻止通知工作的许多其他方式,以及 很遗憾,我们无法检查所有这些。

您最好联系华硕支持并告知我们是否 有什么消息。

由于这对我的客户来说是一个低优先级的问题,所以我现在不打算进一步研究它。不幸的是,我没有时间在其他设备上测试同样的问题。如果将来这种情况发生变化,我会相应地更新此问题。到现在为止,我会认为这是未解决的。我很想知道其他人是否在其他品牌的手机上遇到同样的问题。

对于华硕用户,需要考虑一件事:power saving settings 会禁用通知。

2016 年 9 月 30 日编辑: 我已经就这个问题联系了 Firebase 支持。他们似乎同意 Arthur Thompson 的说法:

  • 已停止的应用程序不应收到消息。
  • 从最近列表中滑动应用应该不会停止应用。

有趣的是我的应用似乎没有停止。运行 adb shell dumpsys package | grep stopped 时,我的包返回:

User 0:  installed=true hidden=false stopped=false notLaunched=false enabled=0

这表明它没有停止并且应该仍会收到消息(根据非常乐于助人的 Firebase 支持工程师的说法)。但是应用没有收到消息。

2016 年 9 月 27 日编辑: 我在有效负载中省略了notification 对象,并将该信息移到data 对象中。这并不能解决问题。我想我还不够清楚问题是什么。问题是,当应用程序被终止(从最近的应用程序中删除)时,该服务不再被调用或接收通知。

原帖

那里有类似的帖子,但没有一个解决这个问题或给出解决方案。

我正在实施 FCM 以获取通知。 (我是 FCM 的新手。)消息负载是 notificationdata 的组合。当应用程序在前台时,服务会触发onMessageReceived()。当应用程序在后台(即我按下主页按钮)时,onMessageReceived() 不会触发(如预期的那样),而只是显示一个通知。我仍然可以看到MyFirebaseMessagingService.onCreate()onDestroy() 上的日志语句,非常棒。

现在,当我通过按下“最近使用的应用程序”按钮关闭应用程序并将应用程序滑出列表时,我不再收到任何通知。 onCreate()onDestroy() 不再被调用。没有通知出现。我也希望在这种情况下出现通知。

示例负载:

{
    "to":"token",
    "priority":"high",
    "notification": {
        "body":"hello",
        "title":"Message from Mom",
        "click_action":"ACTIVITY_MAIN"
    },
    "data":{
        "open":"chat"
    }
}

FCM 服务:

public class MyFirebaseMessagingService extends FirebaseMessagingService {

    @Override
    public void onCreate() {
        super.onCreate();
        Log.v(DmcApplication.TAG, "Service Created");
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.v(DmcApplication.TAG, "Service Destroyed...");
    }

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        Log.v(DmcApplication.TAG, "Message received!");
        EventBus.getDefault().post(new MessageEvent(remoteMessage.getNotification().getBody()));
    }

}

清单的一部分(如果相关)

<service
    android:name="com.example.package.myFirebaseMessagingService"
    android:exported="false">
    <intent-filter>
        <action android:name="com.google.firebase.MESSAGING_EVENT" />
    </intent-filter>
</service>

日志:

//Log when app is in foreground and message comes in:
V/coo: Service Created
V/coo: Message received!
V/coo: Service Destroyed...

//Log when app is in background and message comes in:
V/coo: Service Created
V/coo: Service Destroyed...

//Log when app is killed:
<silence...>

任何帮助将不胜感激,因为我已经坚持了好几天了。

【问题讨论】:

  • 这是预期行为:当您的应用处于非活动状态时,系统会处理通知消息。如果您总是希望您的应用程序处理消息,请发送不带通知对象的数据消息。见this section in the Firebase documentationthis answer I just wrote
  • 已经看到很多这种类型的询问,而且几乎都是一样的。请参阅以下答案:stackoverflow.com/a/37429495/4625829stackoverflow.com/a/39505298/4625829。第二个答案中有一些细节,特别是来自不同用户的 cmets 部分,可能也会给你一些想法。
  • 当一个应用程序被杀死时,它应该只被用户操作唤醒,即用户点击应用程序图标。因此,如果您的应用程序在被杀死后没有收到 FCM 消息,那么这是意料之中的。但是,从最近列表中滑动时不应终止应用程序,这是不正确的行为,您在什么设备上看到这个?
  • @Coo 想到了同样的事情。随意对您认为有帮助的帖子和答案进行投票。干杯!
  • @BackPacker 不,还没有。大约一周左右,我收到了一封来自 Firebase 的电子邮件,上面写着“抱歉回复晚了,我们仍在调查中”。所以我有点希望它会发生。当它发生时,我一定会更新。

标签: android firebase firebase-cloud-messaging


【解决方案1】:

我遇到了同样的问题,查看您的“priority:high”字符串,看起来您正在发送到 Android 和 iOS。我最终摆脱了消息的通知部分,只是将我需要的信息放入数据消息中。数据有效负载部分会触发您的服务,即使它已被后台处理或从最近的应用程序中删除。

在我的服务器上,我检查用户是否从 iOS 设备或 Android 设备注册了他们的令牌,并相应地发送有效负载以及适用于 iOS 设备的通知有效负载和适用于 Android 设备的数据有效负载。

【讨论】:

  • 我只是更改了我的代码以省略通知对象并将所有内容放入数据中。当调用onMessageReceived() 时,这种情况会发生变化,但这从来都不是问题。问题(在此更改后仍然存在)是当应用程序被“杀死”时,什么也没有发生。该服务根本没有启动。通知消失得无影无踪。
  • 如果应用被杀死,无论通知的格式如何,它都不会收到通知。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-18
  • 1970-01-01
相关资源
最近更新 更多