【问题标题】:How to start an activity when a message is received, even if app is dead (swiped away)?收到消息时如何启动活动,即使应用程序已死(刷掉)?
【发布时间】:2017-06-23 07:39:43
【问题描述】:

在我的应用程序中,我需要通过自定义呼叫类型屏幕通知用户,他必须在其中响应重要的业务决策,这非常重要,以至于他不介意这可能导致糟糕的用户体验。

我使用FCM数据消息,但是在6.0以下的设备中,当应用从当前应用列表中滑出时,不会触发onRecieve方法。

现在我正在使用一项服务,该服务启动广播侦听器来侦听接收到的消息,应用程序在其前景/背景时按预期工作,但是一旦它被刷出,服务就会随着应用程序被终止而停止,但在 6.0 以上的设备中app 不会被 swipe 杀死,这是我目前的观察结果。

基本上,我正在寻找一种即使您的应用被刷掉也可以运行的服务。我知道START_STICKY 的事情,它没有帮助。请帮帮我。

【问题讨论】:

  • 在我的回答here中查看一些有用的细节
  • 你在什么设备上测试?
  • @DavidWasser 当我在低于 6.0 的设备上测试它时,我没有收到任何东西,任何带有 START_STICKY 标志的服务都不会重新启动,即使是前台服务在被刷掉时也会被杀死。但高于 6.0 我看到了预期的行为。我正在使用6.0以上和以下的MI,Samsung,Lenovo
  • @AL。在发布这个问题之前我已经看到了你的答案,如果白名单部分是真的,这是否意味着普通开发人员无法以任何方式实现这一目标?我的应用适用于非常有针对性的客户,他们不介意为此给予任何许可。
  • 在小米和一些联想设备上,您可能需要将您的应用添加到“受保护的应用”列表中。这些设备不允许应用程序在后台运行,除非它们在此受保护应用程序列表中。这是低端设备上的一种省电方法。这将阻止 Android 在您的服务被杀死后重新启动它。

标签: android firebase broadcastreceiver firebase-cloud-messaging


【解决方案1】:

您应该按照文档中的说明实现 FCM,并且每次数据消息到达时都应该调用 onMessageReceived()(即使应用程序被杀死或刷掉)。

如果应用被刷掉后应用没有收到消息,则表示您的设备安装了非标准版本的 Android

不幸的是,在这些设备上,这不是您的应用会遇到的唯一问题。

我的建议是联系制造商并向他们解释他们的定制正在破坏 Android API。

更多信息: Push notifications using FCM not received when app is killed android

【讨论】:

    【解决方案2】:

    确保您已按照文档中的说明在 Android.manifest 中注册了您的服务。这将仅在收到消息时启动您的服务。您不需要让服务持续运行。

    https://firebase.google.com/docs/cloud-messaging/android/receive

    <service
        android:name=".MyFirebaseMessagingService">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT"/>
        </intent-filter>
    </service>
    

    【讨论】:

    • 已经做到了,好像这个服务是由google play服务处理的,请告诉我更多的见解。
    • 完整说明在我提供链接的文档中。
    • 他们没有告诉我们任何关于“当应用程序处于终止状态时”的信息,它只是关于前台和后台状态,
    【解决方案3】:

    创建始终运行的前台服务(除非应用程序被强制关闭) Android - implementing startForeground for a service?

    【讨论】:

    • 链接无法访问,对于前台服务,我们所要做的就是创建一个通知并在您的服务中调用 startforeground() 之类的NotificationCompat.Builder notification = new NotificationCompat.Builder(this) .setContentTitle("Tripin Foreground Service") .setTicker("This depends on your service") .setContentText("I am killed if my app is killed :( ") .setSmallIcon(R.mipmap.ic_launcher); startForeground(Constants.NOTIFICATION_ID.FOREGROUND_SERVICE, notification.build());
    猜你喜欢
    • 1970-01-01
    • 2020-01-30
    • 1970-01-01
    • 1970-01-01
    • 2021-07-15
    • 1970-01-01
    • 1970-01-01
    • 2020-03-22
    • 2021-01-23
    相关资源
    最近更新 更多