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 吗?的主要内容,如果未能解决你的问题,请参考以下文章

JAVA里的函数返回值,可以返回几个?

方法的返回值可以有多个吗?(java)

ORACLE 创建的函数 可以返回两个值吗,该怎么做?

golang中返回空结构体可以返回nil吗

C++的一个函数的返回值可以是结构体吗?

Sql Server - 有啥方法可以找到哪些存储过程返回集合,哪些不返回?