onNewIntent() 生命周期和注册的监听器

Posted

技术标签:

【中文标题】onNewIntent() 生命周期和注册的监听器【英文标题】:onNewIntent() lifecycle and registered listeners 【发布时间】:2012-01-27 00:56:51 【问题描述】:

我正在使用 singleTop Activity 通过onNewIntent() 接收来自搜索对话框的意图。

我注意到onPause()onNewIntent() 之前被调用,然后在之后调用onResume()。视觉上:

搜索对话框已启动 搜索意图触发了活动 onPause() onNewIntent() onResume()

问题是我在onResume() 中注册的侦听器在onPause() 中被删除,但在onNewIntent() 调用中需要它们。有没有一种标准方法可以让这些听众可用?

【问题讨论】:

【参考方案1】:

onNewIntent() 是作为 singleTop 活动的入口点,这些活动已经在堆栈中的其他位置运行,因此无法调用 onCreate()。因此,从活动生命周期的角度来看,需要在onNewIntent() 之前调用onPause()。我建议你重写你的活动,不要在onNewIntent() 中使用这些监听器。例如,大多数时候我的onNewIntent() 方法看起来像这样:

@Override
protected void onNewIntent(Intent intent) 
    super.onNewIntent(intent);
    // getIntent() should always return the most recent
    setIntent(intent);

通过使用getIntent(),所有设置逻辑都发生在onResume()

【讨论】:

@Rodja 请你也评论一下这个***.com/questions/19092631/… 与原始问题相关:请记住,如果您将处理搜索Intent 的代码移动到onResume(),您的活动可能会在每次恢复时尝试执行搜索,可能不是你想要的行为。 Rodja 说:从活动生命周期的角度来看,因此需要在 onNewIntent() android 不需要以这种方式设计之前调用 onPause()。您的活动已经经历了它的生命周期,直到 resume()。 android 无需调用 onPause() 然后再次调用 onResume()。如果应用程序恢复,操作系统可以简单地调用 onNewIntent() 并保持恢复状态。 Rodja 说:从活动生命周期的角度来看,因此需要在 onNewIntent() Android 不需要这样设计之前调用 onPause()。您的活动已经通过其生命周期来恢复。如果行为恢复,他们可以简单地调用 onNewIntent() 并留在恢复中。 Android 序列的问题在于,它无法区分由于用户操作而导致的 onPause 和由于背景意图导致的 onPause。如果您只想在用户操作的情况下执行 onPause,那么您就完蛋了,因为直到将来您才会知道为什么要使用 onPause()。 需要注意的重要一点是getIntent()仍然返回原来的Intent。您可以使用 setIntent(Intent) 更新到新的 Intent。【参考方案2】:

注意:从另一个生命周期方法调用不是一个好习惯。在下面的示例中,我试图实现无论您的 Activity 类型如何,都将始终调用您的 onNewIntent。

OnNewIntent() 总是为 singleTop/Task 活动调用,除了第一次创建活动时。那时 onCreate 被称为为在这个线程上提出的几个查询提供解决方案。

您可以始终通过将 onNewIntent 放入 onCreate 方法来调用它

@Override
public void onCreate(Bundle savedState)
    super.onCreate(savedState);
    onNewIntent(getIntent());


@Override
protected void onNewIntent(Intent intent) 
  super.onNewIntent(intent);
  //code

【讨论】:

直接调用生命周期方法通常不是一个好主意,不是吗?也许是无害的,或者 onNewIntent() 的某些基本实现假设 onPause() 已经被调用?将应用程序代码封装在可从两个位置调用的方法中可能会更安全。 同意。我们使用这种方法遇到了一些边缘情况。最好避免。 是的......我也同意避免这种情况......这也是为那些想从 onCreate 调用 onNewIntent 的人准备的。

以上是关于onNewIntent() 生命周期和注册的监听器的主要内容,如果未能解决你的问题,请参考以下文章

Activity生命周期以及启动模式对生命周期的影响

表单修饰符自定义指令计算属性侦听器过滤器生命周期

表单修饰符自定义指令计算属性侦听器过滤器生命周期

小程序基础06:注册页面

关于 flutter_boost监听flutter页面生命周期

关于 flutter_boost监听flutter页面生命周期