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

DJa*_*ayC 140 lifecycle android android-intent

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

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

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

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

Rod*_*dja 281

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);
}
Run Code Online (Sandbox Code Playgroud)

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

  • 与原始问题相关:请记住,如果您移动代码以将搜索"Intent"处理为`onResume()`,您的Activity可能会在每次恢复时尝试执行搜索,可能不是您想要的行为. (3认同)

Paw*_*ari 16

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

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

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

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

@Override
protected void onNewIntent(Intent intent) {
  super.onNewIntent(intent);
  //code
}
Run Code Online (Sandbox Code Playgroud)

  • 通常不是直接调用生命周期方法的好主意,不是吗?也许无害,或者onNewIntent()的一些基本实现假设已经调用了onPause()?大概更安全的是将应用程序代码封装在可从两个地方调用的方法中. (51认同)
  • 同意.我们使用这种方法遇到了一些边缘情况.最好避免. (12认同)
  • 是的..我也同意避免这种情况......这适用于那些想要从onCreate调用onNewIntent的人. (3认同)