2010-06-30 13 views
23

Al principio La actividad es iniciada por un Intento y se hace algo con este Intento.¿Cómo borrar la intención que inició la actividad?

Cuando cambio la orientación de mi actividad, se vuelve a cargar y la intención se pasa a la actividad.

¿Cómo puedo borrar esa intención para evitar que Activity la vuelva a utilizar?

He intentado setIntent(null), pero sin resultados.

+0

pixel no debería aceptar la respuesta claramente incorrecta y aceptar @ dcg en su lugar. Eso me habría ahorrado aproximadamente una hora de trabajo yendo por el camino equivocado. Consulte la publicación de Dianne Hackborn sobre cómo setIntent es una mentira: https://groups.google.com/forum/#!msg/android-developers/vrLdM5mKeoY/ThkOonAbtloJ – JohnnyLambada

+0

Vea si esto ayuda - stackoverflow.com/a/19820057/313042 – rajath

Respuesta

17

Tuve un problema similar. Esto me ayudó. Quizás también deba usar onSaveInstanceState (Bundle outState) y agregar datos adicionales al paquete, por lo que inState no es nulo, no estoy seguro.

Intent activityIntent = null; // Subsequent times it's null 

@Override 
protected void onCreate(Bundle inState) { 
    super.onCreate(inState); 
    . 
    . 
    if (inState!=null) { 
     /*Recreating activity with a saved state*/ 
    } else { 
     /*Creating activity*/ 
     activityIntent = getIntent(); // First time through intent is used 
     /*Get your Extra Intent data here. You will be capturing data on 1st creation. */ 
} 
+0

Tengo un enfoque similar a continuación que también le permite conservar argumentos selectivos del intento original. – dell116

+1

Esto no funciona para mí cuando abro desde la lista de aplicaciones recientes después de salir de la aplicación retrocediendo. La aplicación se abre con un paquete nulo pero el intento anterior. – CACuzcatlan

0

Mi sugerencia sería alternar esto con una variable booleana para comprobar cuándo se creó o no su actividad.

De lo contrario, puede ver su método onCreate, afaik esto solo se ejecuta cuando la actividad se crea por primera vez.

+1

Convenido. Use 'onRetainNonConfigurationInstance()' para pasar el estado de la actividad anterior a la nueva. – CommonsWare

+3

En realidad, se llamará a onCreate() cada vez que cambie la orientación de su pantalla (la aplicación se destruye y se vuelve a crear básicamente durante este proceso). –

1

Si su intención es enviado a su actividad con una acción (con setAction), simplemente lo siguiente cuando reciba la intención, para evitar la manipulación múltiplo de esta intención cuando la pantalla gira:

Intent i = getIntent(); 
i.setAction(null); 
setIntent(i); 
+0

No funciona - verificado con la API 25. –

8
no hacer

use setIntent(null). Parece que si bien puede funcionar a veces, bajo ciertas condiciones la intención original puede regresar.

En su lugar, llame al setIntent() con una simple intención que no tiene una acción, datos o extras, como new Intent(Context, Class).

De hecho, el uso de setIntent() en realidad no fue una buena decisión de diseño de API en primer lugar. En cambio, como notó DCG, asegúrese de verificar solo su intento la primera vez, cuando su savedInstanceState aún es nulo.

+2

setIntent está ahí para confundirlo, no lo use. Ver la respuesta de @ dcg en su lugar. Cuando se destruye una actividad, la intención original que inició la actividad siempre se reutiliza sin importar lo que haga con setIntent. El Intent original se mantiene fuera de la aplicación por completo, en el ActivityManager, y setIntent no tiene ningún efecto en él. Ver la publicación de Dianne Hackborn: https://groups.google.com/forum/#!msg/android-developers/vrLdM5mKeoY/ThkOonAbtloJ – JohnnyLambada

+0

¡Gracias por la referencia a esa publicación, @JohnnyLambada! Se actualizó la respuesta para evitar engañar a las personas. –

+0

Comprobando que 'savedInstanceState == null' es BRILLANTE !!! Esto me ayudó a diferenciar si estaba comenzando mi MainActivity desde el iniciador o desde un intento recibido al abrir un archivo adjunto de correo electrónico. +1 –

0

En mi caso yo necesitaba para establecer los datos de nulo:

getIntent().setData(null); 
2

Mensaje viejo, pero algunos se podría utilizar esto.

No pierda el tiempo, si su aplicación se reanuda, la intención será allí otra vez.

use la calidad a partir de la "reanudar la actividad", y sólo tiene que añadir un valor extra

putExtra("DONE", 0) 

Y cada vez que se reanude su aplicación, comprobar si ya tiene este valor:

hasExtra("DONE") 

fácil

+0

No funciona. Creo que Android guarda el 'Intento' de una manera diferente, no en la memoria. Solo está agregando este valor en tiempo de ejecución. Cuando se mata la actividad, el sistema recupera el 'Intento 'original nuevamente. –

0

intent.putExtra(YourKey,""); //reset the value to knknown setIntent(intent);

0

Incluso después de eliminar manualmente el Int Después de haber sido analizados, parece que Activity.getIntent() siempre devolverá el Intento original que inició la Actividad.

Para evitar esto, recomiendo algo como esto:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    // The Intent provided by getIntent() (and its extras) will persist through a restore 
    // via savedInstance. Because of this, restoring this activity from a 
    // an instance that was originally started with extras (deep-link or 
    // pre-defined destination) may cause un-desired behavior 
    // (ie...infinite loop of sending the user directly to somewhere else because of a 
    // pre-defined alternate destination in the Intent's extras). 
    // 
    // To get around this, if restoring from savedInstanceState, we explicitly 
    // set a new Intent *** to override the original Intent that started the activity.*** 
    // Note...it is still possible to re-use the original Intent values...simply 
    // set them in the savedInstanceState Bundle in onSavedInstanceState. 
    if (savedInstanceState != null) { 
     // Place savedInstanceState Bundle as the Intent "extras" 
     setIntent(new Intent().putExtras(savedInstanceState)); 
    } 

    processIntent(getIntent()) 
} 

private void processIntent(Intent intent) { 
    if (getIntent().getExtras() == null) { 
     // Protection condition 
     return; 
    } 

    doSomething(intent.getExtras.getString("SOMETHING_I_REALLY_NEED_TO_PERSIST")); 

    final String somethingIDontWantToPersist = 
     intent.getExtras.getString("SOMETHING_I_DONT_WANT_TO_PERSIST"); 

    if(somethingIDontWantToPersist != null) { 
     doSomething(somethingIDontWantToPersist); 
    } 
} 

@Override 
public void onSaveInstanceState(Bundle savedInstanceState) { 
    // Save selective extras from original Intent... 
    savedInstanceState.putString("SOMETHING_I_REALLY_NEED_TO_PERSIST", "persistedValued"); 
    super.onSaveInstanceState(savedInstanceState); 
} 

De esta manera, existe un mecanismo para volcar la intención original al tiempo que conserva la capacidad de retener de forma explícita ciertas partes del original Intención/Intención extras.

Tenga en cuenta que no he probado todos los modos de inicio de actividad.

0

Si establece la acción intención, puede borrar con getIntent().setAction("");

Por ejemplo, en onCreate(...):

... 
String action = getIntent().getAction(); 
if (action != null) { 
    if (action.equals(YOUR_ACTION_WHATEVER)) { 
    doSomethingHere(); // do something here 
    getIntent().setAction(""); // clear the action 
    } 
} 
... 

Esto borrará la acción, de lo contrario será llamado cada vez que se gira el dispositivo .

Cuestiones relacionadas