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


150

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

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

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

问题是我在中注册了侦听器,但onResume()已将其删除onPause(),但在onNewIntent()通话中需要它们。有没有使这些监听器可用的标准方法?

Answers:


294

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

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

所有安装逻辑中发生的onResume()利用getIntent()


@Rodja,请您对此stackoverflow.com/questions/19092631/…进行评论,以及
开发人员

3
与原来的问题:记住,如果你移动代码来处理搜索IntentonResume(),你的活动可能会尝试执行每次恢复的时间搜索,可能不是你想要的行为。
东尼·陈

1
Rodja说:从活动生命周期的角度来看,因此需要在Android不需要onNewIntent()之前调用onPause()来设计它。您的活动已经经历了其生命周期,一直到resume()。无需Android调用onPause()然后再次调用onResume()。如果应用恢复运行,操作系统可以简单地调用onNewIntent()并保持恢复状态。
Sani Elfishawy 2014年

Rodja说:从活动生命周期的角度来看,因此需要在Android不需要onNewIntent()之前调用onPause()。您的活动已经经历了生命周期的恢复。如果该行为恢复了,则可以简单地调用onNewIntent()并保留在恢复中。Android序列的问题在于,它无法区分由于用户操作引起的onPause与由于背景意图引起的onPause。如果您只想在用户操作时执行onPause,那么您会很费力,因为您直到将来都不知道为什么要使用onPause()。
Sani Elfishawy 2014年

需要注意的重要一点是,getIntent()仍返回原始Intent。您可以使用setIntent(Intent)更新到新的Intent。
linuxjava 2014年

15

注意:从另一个方法调用生命周期方法不是一个好习惯。在下面的示例中,我试图实现无论您的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
}

59
通常,直接调用生命周期方法不是一个好主意,不是吗?也许是无害的,或者onNewIntent()的某些基本实现假定onPause()已被调用?大概更安全地将应用程序代码封装在可从两个地方调用的方法中。
BernalKC 2015年

12
同意 我们使用这种方法遇到了一些极端情况。最好避免。
Saad Farooq,2015年

3
是的..我也同意避免这种情况……这也适用于希望从onCreate调用onNewIntent的用户。
Pawan Maheshwari,2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.