一个BroadcastReceiver接收到的intent可能是空的吗?

15

换句话说:

@Override
public void onReceive(Context context, Intent intent) {
    final String action = intent.getAction(); // can intent==null here ?
    // could it ever throw a NPE ?
}

我需要彻底解决这个问题,所以请不要有任何犹豫。我会检查是否为空,但我怀疑这并不需要,因此检查会显得笨拙和不优雅。我已经在文档中搜索过了,但没有找到任何东西。

编辑:在谷歌组中提问-请参见此处以获取一些有趣的观点。


已点赞。我收到了用户的崩溃报告,表明在极少情况下意图确实可能为空。 - A.J.
当使用BroadcastReceiver时,实现 onReceive 成员的建议形式来自Kotlin(我认为它来自某个-ktx库),是 override fun onReceive(p0: Context?, p1: Intent?),这清楚地表明那些变量可能为空。你应该进行检查! - Roar Grønmo
@RoarGrønmo Kotlin仅检查未注释的Java签名,因此它会退回到“更安全”的假设,即它可能为空。但这并不意味着它可以为空。 - StenSoft
1个回答

10

onReceiveBroadcastReceiver中,是由注册了特定操作的Intent触发的。因此,如果没有IntentIntent的实例且不为null,onReceive方法将永远不会被调用。

话虽如此,奇怪的情况也可能发生。我没有检查过Google在广播方面的代码,因此尽管在正确使用时它永远不会为空,但检查是一个好主意,因为它来自你无法控制的代码。


2
我刚好遇到了这种情况。当我卸载SD卡时,我的应用程序在4.2.1中崩溃,并且在logcat中有一个BroadcastReceiver.onReceive重写内的NPE。我可以轻松地复现它。一旦我对意图参数进行了空值检查,应用程序就停止崩溃了。 - Yegor
2
ж‚ЁиѓҢеЏ‘еёѓж‚Ёзљ„onReceiveд»Әз Ѓе’Њз›ёеғ”зљ„logcatеђ—пәџжњЂеӨҢдёЉдә е€°pastebin上。如жһњж‚ЁиѓҢењЁд»Әз Ѓдё­дүқз•™иҰЊеЏ·пәЊй‚Әд№€дәљж›ө有帮助。我еҮ№ж­¤ең€ж„џе…өи¶ӘгЂ‚ - bclymer

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