getExtras(name).getString 和 getIntent().getStringExtra(name) 之间的区别

7
我在我的Android应用程序上有一些错误报告,它是在一个Activity的onCreate()方法中发生的Nullpointerexception。 出现问题的代码是getIntent().getExtras().getStringExtra("name")。 (Nullpointerexception)
这意味着getExtras()为null。我确信我在创建intent的每个地方都设置了intent extra。我无法在模拟器或设备上重新创建它。我认为它发生在我尝试再次打开应用程序时(但不是在调试期间),在此期间,Android可能会杀死进程并重新创建活动。但即使在这种情况下,intent extras也应该被保留,对吗?
我试图在模拟器上终止进程,然后再次调用onCreate()方法,getExtras()返回正确的值。
我用getIntent().getStringExtra()替换了代码。除了它不会引发nullpointerexception但仍将String设置为null之外,还有什么区别吗?还有其他区别吗?
这可能是什么原因?
3个回答

8

如果没有额外的内容,Intent.getStringExtra()会返回null。如果没有额外的内容,Intent.getExtras()也会返回null,因此在尝试调用getString()或其他方法之前,需要先检查是否存在额外的内容。


是的,但是getExtras有时候(非常少)会为空吗?我每次都在我的代码中设置extras。 - Daniel Novak
你确定吗?在logcat中看到“has extras”了吗?你确定你的特定活动是如何调用的吗? - EboMike
如果它返回null,表示没有额外信息,无论什么原因。我们看不到您的代码,但最有可能的答案是您的代码允许没有额外信息存在。 - hackbod
好的,我会将此标记为已回答。但我仍然认为有些问题,不是在代码本身 - 它只是一个活动,从另一个活动打开并始终带有额外信息。我记得它曾经失败过,我在很长一段时间后切换到另一个应用程序,然后返回我的活动,结果出现错误。onCreate再次被调用,没有发现任何额外信息(在之前有额外信息的同一活动中,我切换到另一个应用程序之前!) - Daniel Novak

0

getIntent.getExtras() 在某些时候返回 null。getIntent().getStringExtra() 很可能编码为检查 null extras 并在 getExtras() 为 null 时返回 null,这被称为“无 throws”架构。如果是这样,这是有效的运行时执行,并不会抛出异常。在 null extras 上调用 getStringExtra 不是有效的运行时执行,应该抛出异常。

看起来有一条路径 getExtras() 为 null,因此您可以通过检查 null extras 来解决这个问题。


0

我发现在我的代码的其他地方,我正在创建具有String[] extra的快捷方式意图。Android HOME(以及可能是系统的其他部分)不会保留字符串数组,只有原始extra(int,string,long,float ...)。 但是导致问题的代码并没有使用快捷方式,它只是一个接收字符串数组extra的简单活动。也许空extra也是由这个问题引起的 - 应用程序被操作系统杀死,extras无法存储。 在这种情况下,Android不会抛出任何异常。

Romain Guy在这里描述了这个问题: http://groups.google.com/group/android-developers/browse_thread/thread/7f2ce458bd5d112f/189e2b7b2b2532d7

我在这里提出了一个更具体的问题: Shortcut intent extras lost after restart?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接