En Activity.onCreate (), ¿por qué Intent.getExtras () a veces devuelve null?
Esta fue probablemente una falsa alarma, ver mi propia respuesta . Pregunta original a continuación:
Una actividad tiene un botón que lleva al usuario a otra actividad. Para lanzar la nueva actividad, llenamos nuestra intención con extras y onCreate (), la nueva actividad se lee de esos extras a través de Intent.getExtras (). Asumimos que el paquete devuelto no sería nulo, pero como los informes de fallo del cliente descubiertos, getExtras () a veces devuelve null.
- ¿Cómo crear una biblioteca nativa de C ++ en Android?
- ¿Qué significa 'ICU' en Android SDK?
- ¿Hay alguna manera de declarar suprimir las advertencias a la declaración del método?
- ¿Cómo autenticar la solicitud de POST de usuario de Android con Django REST API?
- Ocultar barra de estado de Android
Guardando los extras, como muestra esta respuesta , está perfectamente bien, pero si rellenas los extras de la intención, ¿por qué volvería a nulos más tarde? ¿Hay un lugar mejor (como onResume ()) para leer los extras?
EDIT: Puede ser porque no estamos siguiendo la convención de nombre requerida para las claves:
El nombre debe incluir un prefijo de paquete, por ejemplo, la app com.android.contacts utilizará nombres como "com.android.contacts.ShowAll".
Esto es del javadoc Intent.putExtras . Qué sucede si usted no sigue esta convención de nombre; Es el comportamiento incluso definido?
Aquí está el código relevante:
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 } }
He aquí un ejemplo de seguimiento de la pila de este problema:
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)
- Horizontal ListView con animación en android
- Cómo a los botones de entrada de iluminación retroiluminada de forma programática?
- Cabecera Content-Length ya presente
- ¿Existe una manera de implementar en caliente los cambios delta en un dispositivo Android?
- Último bloque incompleto con CipherInputStream / CipherOutputStream, incluso con relleno AES / CBC / PKCS5Padding
- Android: ¿Cómo sincronizar las consultas con Bolts de Parse.com?
- Bloquear el cuadro de diálogo desde el código JNI
- ¿Se considera reflexión y en qué grado?
Puedes obtenerlo así:
getIntent().getStringExtra(key);
O:
getIntent().getExtras().getString(key)
Y establecerlo como esto en "FromActivity":
Bundle extras = new Bundle(); extras.putString(key, value); intent.putExtras(extras); //And start your activity...
O:
intent.putExtra(key, string); //And start your activity...
De cualquier manera debe funcionar, Espero que esto ayude …
¡Saludos!
Probablemente era una falsa alarma; Es más probable debido a que nuestra propia variable de instancia es nula:
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 } }
Teóricamente, la intención que inicia su actividad podría provenir de cualquier lugar, por ejemplo otro programa
Tienes un error de puntero nulo, ¿te has perdido alguna inicialización? ¿Y puede decirnos qué línea de su código tiene este error. BTW, si usted tiene muchas actividades para manejar, establecer una bandera para su intención es una buena idea.