长时间不活动后打开推送消息
Open Push Message after long inactivity
我有一个使用推送的 android 应用程序。如果应用程序从服务器接收到推送消息,它会创建推送通知(带有标题、消息、图标)并将其呈现给用户。
正常情况
单击通知会打开一个 Activity(不是启动器),activity 打开一个显示基于通知的内容的片段。这里没有魔法,一切都按预期工作。
special/bad 案例
如果设备处于非活动状态至少 2 小时,并且您拿起它并单击之前推送的通知,那么它会像正常情况一样打开 Activity,但不会出现片段。相反,将调用启动器。
虽然调试这既费时又令人沮丧,但我发现了以下内容。也许有人有想法:
Activity 通常以我从资源加载的动画开始。我在 onCreate() 中加载并 运行 它。如果 Activity 被推送调用,那么动画将被加载但永远不会 运行s。我用等待 2 秒的 Handler 绕过它并检查是否调用了动画侦听器。如果不是(不好的情况),则处理程序调用代码来打开片段。
打开片段导致崩溃:
IllegalStateException:无法在 onSaveInstanceState 之后执行此操作。类似于此处 Exception java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState 所以我替换了 commitAllowingStateLoss()。现在没有崩溃了,但片段没有出现。只会调用 Fragment.newInstance() 但不会调用 onCreate() 或任何其他生命周期方法。
问题:
在 activity?
中更长的时间后似乎会破坏我的代码中的功能是什么疯狂状态?
设备:
我目前正在使用 Android 6.0.1
的 Nexus 5 进行测试
我发现,如果我的设备处于这种疯狂的睡眠状态,那么如果我随后单击推送通知,我的 activity 会启动两次。首先,推送会触发 activity 及其意图中的数据。然后,在它之后,启动器 activity 被调用(意图为空)并启动主屏幕。
我像这里一样修复它 -> Activity opened twice
总结一下:
1) 我更改了我的代码,以便我所有的深层链接、推送通知等都将调用 lauchner activity。 activity 然后决定要做什么。这意味着我们有一个进入应用程序的单一入口点。这让一切变得简单,代码也更清晰。
(通过此修复,相同的 activity 将被调用两次。我们需要做更多的工作来修复它)
2) 我在清单中用 android:launchMode="singleTask"
标记了 activity。这意味着如果已经有 activity 的实例,它将被重用而不是第二次创建。
3) 2) 中的标志触发回调方法。系统不会再次调用 activity,而是重用已经 运行 activity 并调用方法 onNewIntent(intent)
。这意味着如果 activity 是新启动的,那么 onCreate()
将被调用。如果 activity 被重用(因为它是由推送通知、深层链接等触发的),那么 onNewIntent(intent)
将被调用。在 onCreate()
和 onNewIntent()
中,我调用一个方法来决定接下来 screen/fragment/activity 是什么,并从 getIntent()
移交意图。完成。
我有一个使用推送的 android 应用程序。如果应用程序从服务器接收到推送消息,它会创建推送通知(带有标题、消息、图标)并将其呈现给用户。
正常情况 单击通知会打开一个 Activity(不是启动器),activity 打开一个显示基于通知的内容的片段。这里没有魔法,一切都按预期工作。
special/bad 案例 如果设备处于非活动状态至少 2 小时,并且您拿起它并单击之前推送的通知,那么它会像正常情况一样打开 Activity,但不会出现片段。相反,将调用启动器。
虽然调试这既费时又令人沮丧,但我发现了以下内容。也许有人有想法:
Activity 通常以我从资源加载的动画开始。我在 onCreate() 中加载并 运行 它。如果 Activity 被推送调用,那么动画将被加载但永远不会 运行s。我用等待 2 秒的 Handler 绕过它并检查是否调用了动画侦听器。如果不是(不好的情况),则处理程序调用代码来打开片段。
打开片段导致崩溃: IllegalStateException:无法在 onSaveInstanceState 之后执行此操作。类似于此处 Exception java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState 所以我替换了 commitAllowingStateLoss()。现在没有崩溃了,但片段没有出现。只会调用 Fragment.newInstance() 但不会调用 onCreate() 或任何其他生命周期方法。
问题: 在 activity?
中更长的时间后似乎会破坏我的代码中的功能是什么疯狂状态?设备: 我目前正在使用 Android 6.0.1
的 Nexus 5 进行测试我发现,如果我的设备处于这种疯狂的睡眠状态,那么如果我随后单击推送通知,我的 activity 会启动两次。首先,推送会触发 activity 及其意图中的数据。然后,在它之后,启动器 activity 被调用(意图为空)并启动主屏幕。
我像这里一样修复它 -> Activity opened twice
总结一下:
1) 我更改了我的代码,以便我所有的深层链接、推送通知等都将调用 lauchner activity。 activity 然后决定要做什么。这意味着我们有一个进入应用程序的单一入口点。这让一切变得简单,代码也更清晰。 (通过此修复,相同的 activity 将被调用两次。我们需要做更多的工作来修复它)
2) 我在清单中用 android:launchMode="singleTask"
标记了 activity。这意味着如果已经有 activity 的实例,它将被重用而不是第二次创建。
3) 2) 中的标志触发回调方法。系统不会再次调用 activity,而是重用已经 运行 activity 并调用方法 onNewIntent(intent)
。这意味着如果 activity 是新启动的,那么 onCreate()
将被调用。如果 activity 被重用(因为它是由推送通知、深层链接等触发的),那么 onNewIntent(intent)
将被调用。在 onCreate()
和 onNewIntent()
中,我调用一个方法来决定接下来 screen/fragment/activity 是什么,并从 getIntent()
移交意图。完成。