Je veux transmettre une nouvelle intention, mais différente, à une activité. Comment faites-vous la différence entre la nouvelle intention et les intentions précédentes? Quel type de code entre dans onNewIntent ()? Un exemple sera très utile.
La nouvelle intention fait partie de onNewIntent(Intent)
. La Intent
d'origine est toujours disponible via getIntent()
.
Vous mettez le code dont vous avez besoin dans onNewIntent
afin de mettre à jour l'interface utilisateur avec les nouveaux paramètres; probablement semblable à ce que vous faites dans onCreate
.
En outre, vous souhaiterez probablement appeler setIntent(intent)
dans onNewIntent
pour vous assurer que les prochains appels à getIntent()
du cycle de vie de l'activité obtiennent les données Intent
les plus récentes.
La manière dont une intention parvient à votre activité dépend du launchMode (voir la documentation launchmode à l'adresse http://developer.Android.com/guide/topics/manifest/activity-element.html#lmode ).
Pour launchmode "standard" (par défaut), une startActivity avec une nouvelle intention se traduira par un onCreate avec cette intention vers une nouvelle instance de l'activité.
Pour les modes de lancement "singleTop" et "singleTask", une startActivity avec une nouvelle intention se traduira par:
a) un onCreate avec cette intention dans une nouvelle instance de l'activité (si cette activité n'était pas en cours d'exécution) [selon la "norme" ci-dessus] ou b. un onNewIntent avec cette intention dans l'activité existante (si cette activité était déjà en cours).
Pour b), la deuxième intention est disponible dans les paramètres onNewIntent. Ce que vous faites avec cela dépend de votre application. Certaines applications vont simplement l'ignorer, alors que d'autres feront un setIntent () et commenceront à réinitialiser/mettre à jour le traitement de la nouvelle intention.
public class MainActivity extends Activity
{
public void onCreate(Bundle SavedInstanceState)
{
}
@Override
protected void onNewIntent(Intent intent)
{
super.onNewIntent(intent);
if(intent.getStringExtra("methodName").equals("myMethod"))
{
myMethod();
}
}
public void myMethod()
{
}
}
public class CallingActivity extends Activity
{
public void onCreate(Bundle savedInstanceState)
{
Intent i=new Intent(this,MainActivity.class);
i.putExtra("methodName","myMethod");//goes to previous INtent
startActivity(i);//will trigger only myMethod in MainActivity
}
}
public class CallingActivity extends Activity
{
public void onCreate(Bundle savedInstanceState)
{
Intent i=new Intent(this,MainActivity.class);
startActivity(i);//will trigger New Activity i.e. MainActivity
}
}
Il y a un bug lié à cela: http://code.google.com/p/Android/issues/detail?id=17137
Si vous ne souhaitez pas que votre activité réutilise la nouvelle intention dans chaque onResume()
suivant, je vous recommande de stocker l'intention dans un champ d'instance plutôt que via setIntent(intent)
.
De cette façon, vous pouvez réinitialiser ce champ d'instance sur null une fois que vous avez consommé l'intention sans rejeter l'intention de lancement initiale.
Plus de détails dans ma réponse ici: https://stackoverflow.com/a/21261404/621690
setIntent(Intent)
a été qualifié d'erreur par un ingénieur du framework Android: https://groups.google.com/forum/#!topic/Android-developers/vrLdM5mKeoY