Activity.getIntent() 可以返回 null 吗?
Posted
技术标签:
【中文标题】Activity.getIntent() 可以返回 null 吗?【英文标题】:Can Activity.getIntent() ever return null? 【发布时间】:2016-10-17 19:21:24 【问题描述】:Activity.getIntent()
可以返回 null
吗?
文档没有提到这是一种可能性,所以我想知道是否必须在取消引用之前检查 getIntent()
的结果以获取 null
值。
【问题讨论】:
我想这也可以改写为“Activity
在其正常生命周期中是否可以在不涉及Intent
的情况下被触发?”
no getIntent
永远不会返回 null,因为它是您用来启动 Activity 的对象
它可以返回null,但前提是您在Activity
中将其设置为null。
【参考方案1】:
可以, 但仅在两种情况下:
在活动构造函数中:
Intent 设置在内部attach
方法中,从Instrumentation
类调用:
public Activity newActivity(Class<?> clazz, Context context,
IBinder token, Application application, Intent intent, ActivityInfo info,
CharSequence title, Activity parent, String id,
Object lastNonConfigurationInstance) throws InstantiationException,
IllegalAccessException
Activity activity = (Activity)clazz.newInstance();
ActivityThread aThread = null;
activity.attach(context, aThread, this, token, 0, application, intent,
info, title, parent, id,
(Activity.NonConfigurationInstances)lastNonConfigurationInstance,
new Configuration(), null, null);
return activity;
因此,intent 在构造函数中始终为 null。
setIntent(null) 之后:
可以使用 setIntent()
从活动外部更改意图。
在所有其他情况下都不能。
【讨论】:
【参考方案2】:当您的应用程序在内存中从市场更新并在更新后重新启动时,它可能为空。 也许即使您将通过 Studio 手动进行更新,或者从 .apk 文件进行更新,也会产生相同的效果。不确定,抱歉。
我曾经在 Google Dev 控制台中更新了应用程序,并在 Crashlitics 中通过调用 getIntent() 获得了几个不同的 NPE。它发生在所有屏幕上,我使用 getIntent().getExtra() onCreate 甚至在生命周期的后期。
所以...它看起来很难看,但为了避免崩溃,我需要在调用 getIntent 时检查意图是否为 NULL 值,并且大多数时候如果意图为空,我会调用 Finish()。但是您可以根据自己的目的制作其他逻辑。
【讨论】:
你能用示例应用证明吗?我试图重现它,但没有成功。 @g4s8 我无法创建应用程序,代码将在其中初始化任何导致崩溃的操作。另外,我不确定在每部手机上都可以重现。所以我想最好的方法就是进行检查。 omg,android 一如既往的给我们惊喜。谢谢你的解释! 我想更新我的笔记:在我搬到 Kotlin 之后,intent 从来没有给我带来活动中的null
值。同时我发现在保存实例状态后重新创建活动后,任何意图额外内容都将是null
。因此,如果您覆盖 saveInstantState(outState),请将您在 intent.extras 中拥有的所有额外内容放入 bundle 中。【参考方案3】:
总是使用onSaveInstanceState()
回调方法来避免这种情况,因为来自getIntentExtra()
的空数据会导致NPE。将额外数据保存到outState
bundle 并在 onCreate() 回调中检索它,方法是进行空检查以确认活动是重新创建还是新活动。
示例:
if (savedInstanceState != null)
extraData = savedInstanceState.getString(EXTRA_DATA);
else
extraData = getIntent().getStringExtra(EXTRA_DATA);
【讨论】:
以上是关于Activity.getIntent() 可以返回 null 吗?的主要内容,如果未能解决你的问题,请参考以下文章