web-dev-qa-db-fra.com

Comment capturer la nouvelle intention dans onNewIntent ()?

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.

38
user588132

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.

80
Christopher Orr

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.

20
Torid

Votre activité appelée-Activité principale

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()
    {
    }
}

Votre activité d'appel

Code va à l'intention précédente

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
    }
}

Votre activité d'appel

Code commence une nouvelle activité en utilisant ce type d'intention

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
    }
}
12
Vikalp Patel
3
Vik

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

0
Risadinha