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