在重写onNewIntent时是否有任何理由不调用setIntent?

Rau*_*ait 26 android android-intent android-activity

在遇到类似于这个问题的问题时,我开始想知道为什么我们setIntent在重写时明确地必须调用onNewIntent,以及为什么这个代码不会被执行super.onNewIntent.

@Override
public void onNewIntent(Intent intent)
{
  super.onNewIntent(intent);

  // Why isn't this performed by the framework in the line above?
  setIntent(intent);
}
Run Code Online (Sandbox Code Playgroud)

Fuz*_*gic 40

Intent只要这些组件正在运行Activity,对象就会持久地附加到Service其他组件上.他们不会因为你搬到另一个应用程序而离开.这是因为Android可能会随时终止该进程,但用户可能仍希望返回并继续他们正在做的事情.这使得Intents非常适合通过Extras存储或传输小的(有时是大的)信息.

onNewIntent()方法专门用于处理更持久的应用程序组件,因此可以在其LifeCycle期间多次调用,但需要跟踪调用它的原因(以及调用它的数据).是否打电话setIntent()取决于你需要做什么.

如果您不在乎为什么随后调用它,您可以Intent通过不调用来保留原件setIntent().当你Activity(或其他一些组件)做同样的事情时,无论是谁调用它以及它提供了什么数据,这都特别有用.

如果您需要单独回复每个事件,那么您必须至少存储新Intent信息.这意味着您可以避免setIntent(),然后它链接到的任何组件都不会有任何Intent信息,除非您直接发送给它们.对于无法确保原件Intent完全处理的应用程序,这可能是所需的行为.

如果您需要单独回复每个Intent并且原件Intent无关紧要,那么您可以使用setIntent().这会丢弃Intent仍然在那里的原件......并放置新的原件,Intent这样如果用户离开(再次),他们将回到同一个地方.

之所以super.onNewIntent()不处理这个问题是因为核心组件类无法确定新组件是否Intent比旧组件更重要.所有它关心的是它一个Intent,而不是它.这就是我们覆盖这些方法的原因,以便我们确定哪些是重要的,哪些不是.一般的感觉是,类似的基类Activity可以以任何方式使用我们拥有的任何数据(除非我们覆盖并告诉它).但是,除非我们具体告诉他们,否则他们不应该(通常也不能)摆脱我们的数据.这是一个你真的不希望与某些程序员有关的论点.呵呵

希望这可以帮助.