Activity.getIntent()是否可以返回null?

时间:2016-06-16 10:21:28

标签: java android android-intent

Activity.getIntent()可以返回null吗?

文档没有提到这种可能性,所以我想知道在解除引用之前我是否必须检查getIntent() null值的结果。

3 个答案:

答案 0 :(得分:51)

是的,它可以, 但只有两种情况:

在活动构造函数中:
意图在内部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()来改变活动之外的意图。

在所有其他情况下,它不能。

答案 1 :(得分:14)

当您的应用程序在内存中更新并且在更新后再次重新启动时,它可以为null。 甚至如果您将通过Studio或.apk文件手动更新,也会产生相同的效果。不确定,抱歉。

我曾经在Google Dev控制台中更新了应用程序,并在调用getIntent()的行中在Crashlitics中获得了几个不同的NPE。它发生在所有屏幕上,我使用getIntent()。getExtra()onCreate,甚至更晚的lifeCycle。

所以...它看起来很难看,但是为了避免崩溃我需要在调用getIntent时检查NULL值的意图,并且如果intent为null,我大多数时候调用Finish()。但你可以为你的目的制定其他逻辑。

答案 2 :(得分:-1)

总是使用onSaveInstanceState()回调方法来避免这种情况,因为getIntentExtra()的数据为空而导致NPE。将额外数据保存到 outState 包中,并在 onCreate() 回调中检索它,方法是通过放置空检查来确认 Activity 是重新创建的还是新的。
示例:

if (savedInstanceState != null) {
    extraData = savedInstanceState.getString(EXTRA_DATA);
} else {
    extraData = getIntent().getStringExtra(EXTRA_DATA);
}