vida savedinstancestate onrestart example developers ciclo activity java android android-intent android-activity android-lifecycle

java - savedinstancestate - onstart android example



En Activity.onCreate(), ¿por qué Intent.getExtras() a veces devuelve null? (4)

Esta fue probablemente una falsa alarma, vea mi propia respuesta . Pregunta original a continuación:

Una actividad tiene un botón que lleva al usuario a otra actividad. Para iniciar la nueva actividad, llenamos nuestro Intent con extras, y enCreate (), la nueva actividad se lee de esos extras a través de Intent.getExtras (). Asumimos que el paquete devuelto no sería nulo, pero a medida que se descubrieron los informes de fallos del cliente, getExtras () a veces devuelve un valor nulo.

La protección de nulos de los extras, como muestra esta respuesta , está perfectamente bien, pero si rellena los extras de la intención, ¿por qué volvería a ser nulo más tarde? ¿Hay un lugar mejor (como onResume ()) para leer los extras?

EDITAR: Puede ser porque no estamos siguiendo la convención de nombres requerida para las claves:

El nombre debe incluir un prefijo de paquete, por ejemplo, la aplicación com.android.contacts usaría nombres como "com.android.contacts.ShowAll".

Esto es desde el javadoc Intent.putExtras . Qué pasa si no sigues esta convención de nombres; 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 } }

Aquí hay una muestra 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)


Esta fue probablemente 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 } }


Puedes conseguirlo así:

getIntent().getStringExtra(key);

O:

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

Y configúralo así 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 debería funcionar, espero que esto ayude ...

¡Saludos!


Recibió un error de puntero nulo, ¿perdió alguna inicialización? Y puede decirnos qué línea de su código tiene este error. Por cierto, si tiene muchas actividades que manejar, establecer una bandera para su intención es una buena idea.


teóricamente, la Intención que inicia su actividad podría provenir de cualquier lugar, por ejemplo, otro programa