如何判断Android中是否存在Intent附加功能?

Eth*_*len 49 java android android-intent

我有这个代码,检查从我的应用程序中的许多地方调用的活动上的Intent中的额外值:

getIntent().getExtras().getBoolean("isNewItem")
Run Code Online (Sandbox Code Playgroud)

如果未设置isNewItem,我的代码会崩溃吗?在我打电话之前,有没有办法判断它是否已经设定?

处理这个问题的正确方法是什么?

twa*_*ton 105

正如其他人所说,无论是getIntent()getExtras()可能返回null.因此,您不希望将调用链接在一起,否则您可能最终null.getBoolean("isNewItem");会调用哪个会抛出NullPointerException并导致应用程序崩溃.

以下是我将如何实现这一目标.我认为它以最好的方式格式化,并且很容易被其他可能正在阅读您的代码的人理解.

// You can be pretty confident that the intent will not be null here.
Intent intent = getIntent();

// Get the extras (if there are any)
Bundle extras = intent.getExtras();
if (extras != null) {
    if (extras.containsKey("isNewItem")) {
        boolean isNew = extras.getBoolean("isNewItem", false);

        // TODO: Do something with the value of isNew.
    }
}
Run Code Online (Sandbox Code Playgroud)

如果额外不存在,您实际上不需要调用,containsKey("isNewItem")因为getBoolean("isNewItem", false)它将返回false.你可以将上面的内容压缩成这样的东西:

Bundle extras = getIntent().getExtras();
if (extras != null) {
    boolean isNew = extras.getBoolean("isNewItem", false);
    if (isNew) {
        // Do something
    } else {
        // Do something else
    }
}
Run Code Online (Sandbox Code Playgroud)

您还可以使用这些Intent方法直接访问附加内容.这可能是最干净的方法:

boolean isNew = getIntent().getBooleanExtra("isNewItem", false);
Run Code Online (Sandbox Code Playgroud)

实际上这里的任何方法都是可以接受的.选择一个对你有意义并且那样做的方法.

  • 我有一个问题,理解为什么人们首先使用`getExtras()`.为什么这样?`Intent`类具有获取任何类型`extra`所需的所有方法 - 不需要获得`Bundle`. (3认同)
  • 谢谢@Squonk,这是一个好点.当你有很多额外的枚举时,有时从'Intent`中获取整个`Bundle`会更清晰一些. (3认同)

Mer*_*aye 9

你可以这样做:

Intent intent = getIntent();
if(intent.hasExtra("isNewItem")) {
   intent.getExtras().getBoolean("isNewItem");
}
Run Code Online (Sandbox Code Playgroud)


Lui*_*uis 8

问题不getBoolean()在于getIntent().getExtras()

以这种方式测试:

if(getIntent() != null && getIntent().getExtras() != null)
  myBoolean = getIntent().getExtras().getBoolean("isNewItem");
Run Code Online (Sandbox Code Playgroud)

顺便说一下,如果isNewItem不存在,则返回默认值vaule false.

问候.