当应用程序从多任务托盘停止时,Android 应用程序未收到 Firebase 通知
Posted
技术标签:
【中文标题】当应用程序从多任务托盘停止时,Android 应用程序未收到 Firebase 通知【英文标题】:Android app not receiving Firebase Notification when app is stopped from multi-task tray 【发布时间】:2017-01-23 02:35:13 【问题描述】:我在 SO 上阅读了 similar question,但是,我无法从中得到正确答案。
我有一个系统,其中我们向大约 500 台设备发送通知。
很遗憾,其中许多设备都没有收到通知。我发现OPPO F1系列手机尤其没有收到通知。
我观察到如果应用程序从多任务托盘停止,就会发生这种情况。我该如何解决这个问题?
更新:我观察到,当我从任务托盘关闭应用程序时,我的应用程序在应用程序管理器中被强制停止。虽然当我从任务托盘关闭 Whatsapp 时,它仍然没有被强制停止。 Whatsapp 是如何处理的?
【问题讨论】:
同样的问题可以解决..***.com/a/45810771/1993001 ***.com/questions/45267335/… 【参考方案1】:2017 年 3 月更新 - 包括我的回答 here 的一部分。
关于滑动关闭/杀死/强制停止的话题,这个话题已经讨论了很长时间,似乎没有一个明确的答案。在我的一项测试中,如果我滑动关闭 我的应用程序。但是当我从“设置”菜单强制关闭它时,我无法接收任何消息。请注意,这并非始终是这种行为。
有些设备被设计为当您滑动关闭应用程序时,它与强制停止它们相同(请参阅我的回答here)。
还有一些设备,即使应用程序仍然只是简单地刷掉,即使它没有强制关闭,设备本身也会阻止它接收消息。其他人说这不可能,因为像 WhatsApp 这样的应用程序能够做到这一点。到目前为止,我之所以了解到这一点,是因为设备制造商已将大多数知名应用程序列入白名单,以使其成为可能。
这在任何地方都没有记录,因为 (IMO),这也是一个取决于设备的主题,并且 FCM 没有完全控制。
原答案:
由于它是特定于设备的(正如您在帖子中提到的:OPPO F1 系列手机),当应用程序从多任务托盘中停止时很有可能 em> 在该设备中,它实际上是在杀死应用程序,导致与之关联的服务和其他后台进程也被破坏。请参阅此answer,以进一步了解我要说的内容。
如果您在社区中搜索,这里通常建议使用START_STICKY 标志。但是,我看到之前提到过 FirebaseMessagingService
(参见 post,@ArthurThompson 的评论):
这些服务将由始终在设备上运行的 Google Play 服务启动。您不必也不应该自己启动/停止这些服务。
话虽如此,也有可能(再次来自 cmets):
设备上可能存在允许/禁止此设置的设置。
我建议进一步测试服务是否被设备本身杀死,或者查看是否有阻止通知的设置。
【讨论】:
@AL 是真的(我没有另外说),但它不会阻止您接收推送通知。 Google Play Services 与 GCM /FCM 建立了永久连接,一旦收到消息,它就会启动您声明的服务以向您发送消息。所以不管你的应用是否完全死机,只要你正确实现了 GCM,你就会收到消息。 @AL。是的,当然,看看这个:stuff.mit.edu/afs/sipb/project/android/docs/google/gcm/gcm.html 他们几乎不谈论它,但这是一个有趣的文件。您还可以在其他 SO 答案中找到更多信息。 ***.com/questions/19111901/… @milanm 包括OPPO在内的很多中国厂商都有模仿ios的倾向。在我的公司,我们发现他们中的许多人认为关闭最近的屏幕与强制杀死应用程序相同,更重要的是,这种行为并没有统一执行,即流行的 IM 应用程序不受这种行为的影响。所以我建议你下载其他不太受欢迎的应用程序并测试它们的行为。 @KapilRajput 你有链接来支持你的主张,所以我可以把它展示给我的老板吗? :D @AL。它是一个带有库存 android 25 和 google api 的模拟器,但它在应用程序没有被强制关闭时工作。你对如何调试这个有什么建议吗?在带有 android 7.1.1 的 OnePlus 3T 上也是如此【参考方案2】:您是否尝试在您的服务类上使用stopWithTask 属性?
<service
android:name="com.yourapp.YourPushService"
android:stopWithTask="false" />
如果设置为 true,则此服务将在 用户删除根植于应用程序拥有的活动的任务。这 默认为假。
如果标志为 false,则您的 Service 类中有一个 onTaskRemoved
回调。
如果您可以检测到“滑动”事件,您可以实施解决方法。
【讨论】:
这对我有用。在com.yourapp.YourPushService
中,您需要输入扩展FirebaseMessagingService
的类:)
所以设置 true 或 false ?用于防止杀死服务
stopWithTask的默认值是false,有什么意义呢?
根据问题,FirebaseMessagingService
始终在运行,即使应用程序从系统托盘关闭。我同意@codepeaker【参考方案3】:
我也经历过同样的事情,但就我而言,是小米手机而不是 Oppo 手机。实际发生的是,当您从系统托盘关闭应用程序时,系统会完全终止应用程序。这意味着您的应用将无法通过 GCM/FCM 接收通知。 WAKE_LOCK
权限也无济于事。
这并不意味着手机没有收到通知。它是。它只是不会让应用程序显示它。您可以通过从 adb 发送广播并查看您的 logcat 来验证这一点。
解决此问题的一种可能方法是使用SyncAdapter
。虽然不建议这样做,但我已经看到一些应用程序使用它。其他可能的解决方案是使用某种始终运行的后台服务。有些人还使用AlarmManager
,因为它几乎永远不会被杀死。我的观点是 - 您不能依赖 GCM/FCM 来获取通知。
现在让我们谈谈 WhatsApp -
在小米手机中,它们会根据特定标准将应用列入白名单或黑名单。如果您下载了一个应用程序并且它在他们的白名单中,他们将允许该应用程序显示通知。如果没有,你已经知道会发生什么。但好处是您可以更改这些设置。查找名为 Security 的应用程序。如果您撤销正确的权限,即使 WhatsApp 也将停止显示通知。
【讨论】:
您能否详细说明如何利用SyncAdapter
来传递通知?我们已经在使用SyncAdapter
来同步我们的数据。我们如何处理推送通知?
请举例说明您在这种情况下如何使用SyncAdapter
【参考方案4】:
我也遇到了同样的问题,但是经过大量调试后,我意识到,我正在停止接收Firebase
通知的服务,其中一个活动的停止方法。
-
请检查您是否在应用程序的任何位置停止这些服务。
确保您使用的是服务而不是意图服务。
刷卡应用永远不会停止服务。因此,请尝试在前两点调试应用程序。
【讨论】:
【参考方案5】:已找到答案here
无法从通知控制台发送数据消息。
但是还有其他方法可以向设备发送通知,它们会在 onMessageReceived 中捕获!
您需要可以使用终端(Mac 或 Linux)或 Postman 等服务在此链接上发送 Post 请求:https://fcm.googleapis.com/fcm/send
与下一个身体:
"to": "/topics/your_topic_here",
"data":
"text":"text",
"text1":"text1",
...
你还需要添加 2 个标题:
-
授权 - key=your_server_key_here
内容类型 - 应用程序/json
要获取您的服务器密钥,您可以在 Firebase 控制台中找到它:您的项目 -> 设置 -> 项目设置 -> 云消息传递 -> 服务器密钥
【讨论】:
【参考方案6】:我正在使用 MoEngage 推送通知服务来发送推送通知。
解决方案是在 Android 的 Application 类中初始化 PushNotification 对象/服务,而不是 MainActivity。
然后在killed状态下也会收到通知。
如何从Application类调用
在您的 androidManifest.xml 文件中的应用程序标记中声明将成为应用程序类的类名
<application
android:name="App" //class name that will be an Application class
android:label="@string/app_name"
android:fullBackupContent="@xml/backup_descriptor"
android:usesCleartextTraffic="true"
android:icon="@mipmap/ic_launcher">
这将是 App.kt 类
class App: FlutterApplication()
override fun onCreate()
super.onCreate()
//initialize your notification service here
【讨论】:
【参考方案7】:当应用程序关闭时,它会关闭服务。您必须重新启动服务。见here
【讨论】:
以上是关于当应用程序从多任务托盘停止时,Android 应用程序未收到 Firebase 通知的主要内容,如果未能解决你的问题,请参考以下文章