在Activity.onCreate()中,为什么Intent.getExtras()有时返回null?

这可能是一个虚惊,请看我自己的答案 。 下面的原始问题:

一个活动有一个把用户带到另一个活动的button。 为了启动新的活动,我们使用extras和onCreate()来填充我们的Intent,新活动通过Intent.getExtras()从这些额外内容中读取。 我们假设返回的包是非空的,但是当发现客户崩溃报告时,getExtras()有时会返回null。

这个答案显示 ,没有多余的保护是非常好的,但是如果你填充了intent的extras,那么为什么它会在以后返回null呢? 有没有更好的地方(如onResume())阅读额外的东西?

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

该名称必须包含一个包前缀,例如,应用程序com.android.contacts将使用“com.android.contacts.ShowAll”之类的名称。

这是来自Intent.putExtras javadoc 。 如果你不遵循这个名称约定会发生什么? 是甚至定义的行为?

以下是相关的代码:

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) 

Solutions Collecting From Web of "在Activity.onCreate()中,为什么Intent.getExtras()有时返回null?"

你可以这样得到它:

 getIntent().getStringExtra(key); 

要么:

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

在“FromActivity”中设置为:

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

要么:

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

无论哪种方式应该工作,希望这有助于…

问候!

这可能是一场虚惊; 这更可能是由于我们自己的实例variables为空:

 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 } } 

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

你有一个空指针错误,你错过了一些初始化? 你能告诉我们哪行代码有这个错误吗? 顺便说一句,如果你有很多活动要处理,为你的意图设置一个标志是一个好主意。