当前位置: 首页 > 知识库问答 >
问题:

在活动中。onCreate(),为什么意图。getExtras()有时返回null?

司寇山
2023-03-14

这可能是一个错误的警报,见我自己的答案。下面的原始问题:

一个活动有一个按钮,可以将用户带到另一个活动。为了启动新的活动,我们用extra填充我们的Intent,而onCreate(),新活动通过Intent读取这些extra。getExtras()。我们假设返回的bundle是非null的,但正如客户崩溃报告所发现的,getExtras()有时返回null。

正如这个答案所示,空值保护附加值是非常好的,但是如果你填充了意图的附加值,那么为什么它以后会返回空值呢?有没有更好的地方(比如onResume())可以阅读额外的内容?

编辑:这可能是因为我们没有遵循密钥所需的名称约定:

名称必须包含包前缀,例如,应用com.android.contacts将使用像"com.android.contacts.ShowAll"这样的名称。

这是出于本意。PutextrasJavadoc。如果你不遵循这个命名惯例会发生什么;这种行为有定义吗?

以下是相关代码:

class FromActivity extends Activity {

    ImageButton button;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.from_view);

        button = (ImageButton)findViewById(R.id.button);
        button.setVisibility(View.VISIBLE);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent(FromActivity.this, ToActivity.class);
                i.putExtra(ToActivity.SERVER_PARAM, ...);
                i.putExtra(ToActivity.UUID_PARAM, ...);
                i.putExtra(ToActivity.TEMPLATE_PARAM, ...);
                startActivityForResult(i, 0); 
                overrideTransition(R.anim.slide_left_in, R.anim.slide_left_out);
            }
        });
    }

}

class ToActivity extends Activity {

    public static final String SERVER_PARAM = "server";
    public static final String UUID_PARAM = "uuid";
    public static final String TEMPLATE_PARAM = "template";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Bundle extras = getIntent().getExtras();
        if (extras == null) {
            finish();
            return;
        }

        // do stuff with extras
    }
}

以下是此问题的堆栈跟踪示例:

java.lang.RuntimeException: Unable to start activity ComponentInfo{ToActivity}: java.lang.NullPointerException
    at  android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2355)
    at  android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2391)
    at  android.app.ActivityThread.access$600(ActivityThread.java:151)
    at  android.app.ActivityThread$H.handleMessage(ActivityThread.java:1335)
    at  android.os.Handler.dispatchMessage(Handler.java:99)
    at  android.os.Looper.loop(Looper.java:155)
    at  android.app.ActivityThread.main(ActivityThread.java:5493)
    at  java.lang.reflect.Method.invokeNative(Native Method)
    at  java.lang.reflect.Method.invoke(Method.java:511)
    at  com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1028)
    at  com.android.internal.os.ZygoteInit.main(ZygoteInit.java:795)
    at  dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.NullPointerException
    at  ToActivity.onCreate(SourceFile:49)
    at  android.app.Activity.performCreate(Activity.java:5066)
    at  android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1101)
    at  android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2311)
     ... 11 more
     java.lang.NullPointerException
    at  ToActivity.onCreate(SourceFile:49)
    at  android.app.Activity.performCreate(Activity.java:5066)
    at  android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1101)
    at  android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2311)
    at  android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2391)
    at  android.app.ActivityThread.access$600(ActivityThread.java:151)
    at  android.app.ActivityThread$H.handleMessage(ActivityThread.java:1335)
    at  android.os.Handler.dispatchMessage(Handler.java:99)
    at  android.os.Looper.loop(Looper.java:155)
    at  android.app.ActivityThread.main(ActivityThread.java:5493)
    at  java.lang.reflect.Method.invokeNative(Native Method)
    at  java.lang.reflect.Method.invoke(Method.java:511)
    at  com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1028)
    at  com.android.internal.os.ZygoteInit.main(ZygoteInit.java:795)
    at  dalvik.system.NativeStart.main(Native Method)

共有3个答案

戎永福
2023-03-14

理论上,启动活动的意图可能来自任何地方,例如另一个程序

闻安宜
2023-03-14

这可能是虚惊一场;更可能是因为我们自己的实例变量为空:

class ToActivity extends Activity {

    public static final String SERVER_PARAM = "server";
    public static final String UUID_PARAM = "uuid";
    public static final String TEMPLATE_PARAM = "template";

    private State state;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        state = initializeState();
        // MISSING NULL CHECK HERE!

        Bundle extras = getIntent().getExtras();
        if (extras == null) {
            finish();
            return;
        }

        // do stuff with state and extras
    }
}
吴飞语
2023-03-14

你可以这样得到:

getIntent().getStringExtra(key);

或者:

getIntent().getExtras().getString(key)

并在"FromActive"中这样设置:

Bundle extras = new Bundle();
extras.putString(key, value);
intent.putExtras(extras);
//And start your activity...

或者:

intent.putExtra(key, string);
//And start your activity...

无论哪种方法都应该有效,希望这有帮助。。。

当做

 类似资料:
  • 我有MainActivity上有一个片段,当用户点击片段时,用户会导航到另一个片段,在最后一个片段上有一个按钮来启动谷歌地图导航,这是代码: 问题是,在地图启动后,我希望用户在按下back时返回到我的应用程序,而不是Launcher。 有没有办法做到这一点。 这是我的完整代码: 主体活动 原木

  • null 直到今天(AFAIK--我有一段时间没有测试过),Firebase云消息传递工作得很好。我可以从Firebase控制台发送带有数据的通知,并且使用将允许我从应用程序访问这些数据。 然而,今天我发送了一个测试通知,但是点击它并没有执行预期的操作。经过一番挖掘,我发现只是返回。以下是相关代码: (这个方法是从主活动中的和调用的。) 我怀疑这与Firebase11 vs 10有关,或者这款应用

  • 问题内容: 在我通过Admob广告中介添加MoPub的最新版本中,我在崩溃日志中看到了一堆ConcurrentModificationException。所有这些似乎都是本机代码,我使用的是与广告相关的所有最新版本以及与Google / android相关的所有库。有人遇到过吗? 这是直到BaseActivity的第21行的代码: 这就是代码,直到最近的最近70行 问题答案: 就我们而言,我们只会

  • 我知道如何使用发送捆绑包,但我的代码会导致。但我不知道为什么。 主要活动 维护活动2(此处接收) 这里,哪一部分错了被添加到捆绑包中,但每次抛出时。

  • 问题内容: 什么时候以及为什么要使用JavaScript? 问题答案: 通常,在事件处理程序(如中)中,返回false是一种告诉事件实际上未触发的方法。因此,在这种情况下,这意味着将不提交表单。