в деятельности.onCreate (), почему намерение.getExtras() иногда возвращает null?
наверное, это была ложная тревога, см. мой собственный ответ. Оригинальный вопрос ниже:
действие имеет кнопку, которая переводит пользователя в другое действие. Чтобы запустить новое действие, мы заполняем наше намерение дополнительными функциями и onCreate (), новое действие читает из этих дополнительных функций через Intent.getExtras(). Мы предполагали, что возвращаемый пакет будет ненулевым, но, как обнаружили отчеты о сбоях клиентов, getExtras () иногда возвращает ноль.
Null-охрана дополнительных услуг, как этот ответ показывает, это прекрасно, но если вы заполняете дополнительные намерения, то почему он когда-либо вернет null позже? Есть ли лучшее место (например, onResume ()) для чтения дополнений?
EDIT: это может быть потому, что мы не следуем соглашению имен, требуемому для ключей:
имя должно содержать префикс пакета, например app com.андроид.контакты будут использовать такие имена, как "com.андроид.контакты.ShowAll".
Это намерениях.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.access0(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.access0(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)
4 ответов
вы можете получить его так:
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...
в любом случае должен работать, надеюсь, это поможет...
С уважением!
вероятно, это была ложная тревога; это более вероятно из-за того, что наша собственная переменная экземпляра равна null:
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
}
}
теоретически намерение, которое начинает вашу деятельность, может исходить из любого места, например, другой программы
У вас ошибка нулевого указателя, вы пропустили некоторую инициализацию? И можете ли вы сказать нам, в какой строке вашего кода есть эта ошибка. Кстати, если у вас есть много действий для обработки, установите флаг для вашего намерения-хорошая идея.