Ten*_*Guh 20 java android android-intent android-lifecycle android-activity
这可能是一个误报,请参阅我自己的答案.原始问题如下:
活动有一个按钮,可以将用户带到另一个活动.为了启动新活动,我们使用extras和onCreate()填充我们的Intent,新活动通过Intent.getExtras()从这些额外内容中读取.我们假设返回的包是非空的,但是当发现客户崩溃报告时,getExtras()有时会返回null.
正如这个答案所示,无法保护额外内容是完全正常的,但是如果你填充了intent的附加内容,那么为什么它会在以后返回null呢?是否有更好的地方(如onResume())来阅读额外内容?
编辑:可能是因为我们没有遵循密钥所需的名称约定:
名称必须包含包前缀,例如app 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
}
}
Run Code Online (Sandbox Code Playgroud)
以下是此问题的示例堆栈跟踪:
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)
Run Code Online (Sandbox Code Playgroud)
Mar*_*res 17
你可以这样得到它:
getIntent().getStringExtra(key);
Run Code Online (Sandbox Code Playgroud)
要么:
getIntent().getExtras().getString(key)
Run Code Online (Sandbox Code Playgroud)
并在"FromActivity"中将其设置为:
Bundle extras = new Bundle();
extras.putString(key, value);
intent.putExtras(extras);
//And start your activity...
Run Code Online (Sandbox Code Playgroud)
要么:
intent.putExtra(key, string);
//And start your activity...
Run Code Online (Sandbox Code Playgroud)
无论哪种方式都应该工作,希望这有助于......
问候!
这可能是一场虚惊。这更有可能是由于我们自己的实例变量为空:
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
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
16330 次 |
| 最近记录: |