遇到与this question类似的问题时,我开始想知道为什么我们在覆盖setIntent
时明确必须调用onNewIntent
,以及为什么super.onNewIntent
尚未执行此代码1}}。
@Override
public void onNewIntent(Intent intent)
{
super.onNewIntent(intent);
// Why isn't this performed by the framework in the line above?
setIntent(intent);
}
答案 0 :(得分:39)
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
,而不是它。这就是为什么我们覆盖这些方法,以便我们确定什么是重要的,什么不是。一般的感觉是像{{1}}这样的基类可以以任何方式使用我们拥有的任何数据(除非我们覆盖并告诉它)。但是,除非我们具体告诉他们,否则他们不应该(通常也不能)摆脱我们的数据。 这是一个你真的不希望与某些程序员有关的论点。和合强>
希望这有帮助。
答案 1 :(得分:3)
onNewIntent状态的文档:“请注意,getIntent()仍会返回原始的Intent。您可以使用setIntent(Intent)将其更新为此新Intent。”我的猜测是onNewIntent存在,以便您的活动可以被通知,超级可能什么都不做。
答案 2 :(得分:1)
我刚刚从setIntent(intent)
实施中移除了onNewIntent(Intent intent)
代码。
原因:
我的MainActivity是单顶。当我的应用程序运行时,它启动其他活动,如相机活动。当应用程序返回到MainActivity时,在onResume()
中getIntent()
返回的(最后)意图将被重新处理,即使它之前已经处理过。
我的新实施(到目前为止工作):
将意图从onNewIntent(Intent intent)
存储在私有实例字段中。在onResume
中检查此字段是否为null并立即将其重置为null,只处理一次intent。
另见https://groups.google.com/forum/#!topic/android-developers/vrLdM5mKeoY