Activity.getIntent()
可以返回null
吗?
文档没有提到这种可能性,所以我想知道在解除引用之前我是否必须检查getIntent()
null
值的结果。
答案 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);
}