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.

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) 

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.

  • Cómo activar la ofuscación de ProGuard en Android Studio?
  • Errores en Eclipse LogCat - Android
  • Analizar la clase anónima no implementa método abstracto
  • Problemas con pruebas de instrumentos Espresso en los dispositivos de tiempo de ejecución de Dalvik
  • IOException durante la lectura de InputStream
  • ¿Por qué siempre escribimos cast en Android / Java?
  • Llame a onSaveInstanceState sin llamar a super.onSaveInstanceState (outState)
  • Java sobreescribiendo métodos al crear una nueva instancia de una clase
  • Android - OpenGL ES 2.0: Emulador (Works) - Dispositivo (no)
  • ¿Diferencia entre appcompat_v7 y android-support-v7-appcompat?
  • ¿Cómo hacer una ventana emergente de diálogo "no me preguntes otra vez"? Androide
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.