android - 长时间不活动后打开推送消息
问题描述
我有一个使用推送的 android 应用程序。如果应用程序从服务器接收到推送消息,它会创建一个推送通知(带有标题、消息、图标)并将其呈现给用户。
正常情况 单击通知会打开一个活动(不是启动器),活动会打开一个片段,该片段显示基于通知的内容。这里没有魔法,一切都按预期工作。
特殊/坏情况 如果设备至少 2 小时处于非活动状态并且您拿起它并单击之前推送的通知,那么它会像正常情况一样打开 Activity 但没有片段出现。相反,将调用启动器。
虽然调试这既费时又令人沮丧,但我发现了以下几点。也许有人有一个想法:
活动通常以我从资源加载的动画开始。我在 onCreate() 中加载并运行它。如果 Activity 被推送调用,那么动画将被加载但永远不会运行。我用一个等待 2 秒并检查动画监听器是否被调用的处理程序绕过了这个。如果不是(坏情况),则处理程序调用代码来打开片段。
打开片段导致崩溃:IllegalStateException:onSaveInstanceState 后无法执行此操作。类似于这里Exception java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState所以我替换了 commitAllowingStateLoss()。现在没有崩溃了,但片段没有出现。只有 Fragment.newInstance() 将被调用,但不会调用 onCreate() 或任何其他生命周期方法。
问题:长时间不活动后似乎破坏了我的代码中的函数的疯狂状态是什么?
设备:我目前正在使用带有 Android 6.0.1 的 Nexus 5 进行测试
解决方案
我发现如果我的设备处于这种疯狂的睡眠状态,那么如果我点击推送通知,我的活动就会启动两次。首先,推送触发了带有意图中数据的活动。然后,在它之后,启动器活动被调用(具有空意图)并启动主屏幕。
我在这里修复了它-> Activity 打开了两次
把它们加起来:
1) 我更改了我的代码,以便我的所有深层链接、推送通知等都将调用 lauchner 活动。然后活动决定做什么。这意味着我们有一个进入应用程序的入口点。这使一切变得简单,代码更清晰。(通过此修复,相同的活动将被调用两次。我们必须做更多的工作来修复它)
2)我在清单中标记了活动android:launchMode="singleTask"
。这意味着如果已经有一个活动的实例,它将被重用而不是第二次创建。
3) 2) 中的标志触发回调方法。系统不会再次调用活动,而是重用已经运行的活动并调用方法onNewIntent(intent)
。这意味着如果活动是新开始的,那么onCreate()
将被调用。如果活动被重用(因为它是由推送通知、深度链接等触发的),那么onNewIntent(intent)
将被调用。在两者中,onCreate()
我onNewIntent()
调用一个方法来决定接下来是什么屏幕/片段/活动,并从getIntent()
. 完毕。
推荐阅读
- python - 带有可选关键字参数的 scipy.sparse.linalg.LinearOperator
- flutter - 子容器的高度取决于父容器的 Widget
- php - SQLSTATE [HY093]:无效的参数号:参数未在发布请求中定义
- scala - 如何在运行时在scala中查找类参数数据类型
- navision - 如何使用 Import-NAVApplicationObject 命令使用导出的 *.fob 更新 NAV2018
- excel - 如何将两个表合并为一个完整的表并使用标准一起删除重复项
- c - 我试图将一个 txt 文件读入一个链表,其中包含一行中的整数和字符串,用逗号分隔
- python - Python tkinter 创建具有不同图层的图像?
- node.js - 服务器启动失败,出现“必须定义 apiKey 值!”
- python - 区域质心内的skimage