长时间不活动后打开推送消息

时间:2018-06-11 12:00:00

标签: android android-fragments push-notification android-doze android-doze-and-standby

我有一个使用推送的Android应用程序。如果应用程序从服务器收到推送消息,则会创建推送通知(带有标题,消息,图标)并将其呈现给用户。

正常情况 点击通知会打开一个活动(而不是启动器),活动会打开一个片段,根据通知显示内容。这里没有魔法,一切都按预期工作。

特殊/不良案例 如果设备处于非活动状态至少2小时并且您将其取出并单击之前推送的通知,则会像正常情况一样打开活动,但不会出现任何碎片。相反,将调用启动器。

虽然调试这个时间成本高且令人沮丧但我发现了以下内容。也许有人有个主意:

  • 活动通常以我从资源加载的动画开始。我在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

1 个答案:

答案 0 :(得分:0)

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

我在这里修好了 - > Activity opened twice

总结一下:

1)我更改了我的代码,以便我的所有深层链接,推送通知等都会调用lauchner活动。然后活动决定做什么。这意味着我们在应用程序中只有一个入口点。这使一切变得简单,代码更清晰。 (使用此修复程序,将调用相同的活动两次。我们还需要做一些修复它)

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

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

相关问题