0

我有一个使用推送的 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 进行测试

4

1 回答 1

0

我发现如果我的设备处于这种疯狂的睡眠状态,那么如果我点击推送通知,我的活动就会启动两次。首先,推送触发了带有意图中数据的活动。然后,在它之后,启动器活动被调用(具有空意图)并启动主屏幕。

我在这里修复了它-> Activity 打开了两次

把它们加起来:

1) 我更改了我的代码,以便我的所有深层链接、推送通知等都将调用 lauchner 活动。然后活动决定做什么。这意味着我们有一个进入应用程序的入口点。这使一切变得简单,代码更清晰。(通过此修复,相同的活动将被调用两次。我们必须做更多的工作来修复它)

2)我在清单中标记了活动android:launchMode="singleTask"。这意味着如果已经有一个活动的实例,它将被重用而不是第二次创建。

3) 2) 中的标志触发回调方法。系统不会再次调用活动,而是重用已经运行的活动并调用方法onNewIntent(intent)。这意味着如果活动是新开始的,那么onCreate()将被调用。如果活动被重用(因为它是由推送通知、深度链接等触发的),那么onNewIntent(intent)将被调用。在两者中,onCreate()onNewIntent()调用一个方法来决定接下来是什么屏幕/片段/活动,并从getIntent(). 完毕。

于 2018-06-12T21:33:02.940 回答