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() 生命周期和注册的监听器的主要内容,如果未能解决你的问题,请参考以下文章