代码之家  ›  专栏  ›  技术社区  ›  Emanuel

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

  •  0
  • Emanuel  · 技术社区  · 8 年前

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

    正常情况 单击通知将打开一个活动(而不是启动程序),该活动将打开一个片段,其中显示基于通知的内容。这里没有魔法,一切都按预期工作。

    特殊/坏情况 如果设备处于非活动状态至少2小时,并且您拿起它并单击之前推送的通知,那么它将像正常情况下一样打开活动,但不会出现碎片。相反,将调用启动程序。

    虽然调试这是一个费时又令人沮丧的过程,但我发现了以下几点。也许有人有一个想法:

    • 活动通常从我从资源加载的动画开始。我加载并在onCreate()中运行它。如果活动被push调用,那么动画将被加载,但不会运行。我用一个等待2秒并检查是否调用动画侦听器的处理程序绕过了这个问题。如果不是(坏情况),那么处理程序调用代码来打开片段。

    • 打开碎片导致崩溃: IllegalstateException:无法在OnSaveInstanceState之后执行此操作。像这里一样 Exception java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState 所以我替换了CommitalOwningStateLoss()。现在已经没有崩溃了,但是碎片没有出现。只调用fragment.newInstance(),但不调用onCreate()或任何其他生命周期方法。

    问题: 在长时间不活动之后,代码中的函数似乎被破坏了,这是什么疯狂的状态?

    设备: 我目前正在用一款搭载Android 6.0.1的Nexus5进行测试。

    1 回复  |  直到 8 年前
        1
  •  0
  •   Emanuel    8 年前

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

    我把它修好了,就像这里一样-> Activity opened twice

    总而言之:

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

    2)我用 android:launchMode="singleTask" .这意味着,如果已经存在活动的实例,那么它将被重用,而不是第二次创建。

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

    推荐文章