62 votes

Activity.getIntent() peut-il jamais retourner null ?

Can [Activity.getIntent()](https://developer.android.com/reference/android/app/Activity.html#getIntent()) jamais de retour null ?

La documentation ne mentionne pas cette possibilité. Je me demande donc si je dois vérifier le résultat de la fonction getIntent() para null avant de la déréférencer.

0 votes

Je suppose que l'on pourrait également reformuler la question en ces termes : "Une entreprise peut-elle Activity ne soit jamais déclenché dans son cycle de vie normal sans une Intent être impliqué ?"

0 votes

Pas de getIntent ne renvoie jamais null, puisque c'est l'objet que vous avez utilisé pour démarrer l'activité

1 votes

Il peut retourner null, mais seulement si vous le définissez comme null dans le fichier Activity .

71voto

g4s8 Points 1103

Oui, il peut , mais seulement dans deux cas :

Dans le constructeur d'activité :
Intention mise en place en interne attach appelée par la méthode Instrumentation classe :

public Activity newActivity(Class<?> clazz, Context context, 
        IBinder token, Application application, Intent intent, ActivityInfo info, 
        CharSequence title, Activity parent, String id,
        Object lastNonConfigurationInstance) throws InstantiationException, 
        IllegalAccessException {
    Activity activity = (Activity)clazz.newInstance();
    ActivityThread aThread = null;
    activity.attach(context, aThread, this, token, 0, application, intent,
            info, title, parent, id,
            (Activity.NonConfigurationInstances)lastNonConfigurationInstance,
            new Configuration(), null, null);
    return activity;
}

donc l'intention est toujours nulle dans le constructeur.

Après setIntent(null) :
Il est possible de changer l'intention depuis l'extérieur de l'activité avec setIntent() .

Dans tous les autres cas, il ne le peut pas.

23voto

RelaxedSoul Points 111

Il peut être nul lorsque votre application a été mise à jour depuis le marché alors qu'elle était en mémoire et relancée après la mise à jour. Peut-être même que si vous faites la mise à jour manuellement par Studio, ou à partir d'un fichier .apk, le même effet se produira. Pas sûr, désolé.

J'ai une fois mis à jour l'application dans la console Google Dev et j'ai obtenu plusieurs NPE différents dans Crashlitics dans les lignes avec l'appel getIntent(). Cela s'est produit pour tous les écrans, où j'ai utilisé getIntent().getExtra() onCreate ou même plus tard dans le cycle de vie.

Donc... Ca a l'air moche, mais pour éviter les crashs, j'ai besoin de vérifier l'intention pour la valeur NULL à chaque fois que j'appelle getIntent et la plupart du temps j'appelle Finish() si l'intention est nulle. Mais vous pouvez faire une autre logique, bien sûr, pour votre but.

1 votes

Pouvez-vous le prouver avec un exemple d'application ? J'ai essayé de le reproduire, mais sans succès.

1 votes

@g4s8 Je n'arrive pas à créer l'application, où le code initialisera toute action qui fait que cela plante. De plus, je ne suis pas sûr que ce soit reproductible sur tous les téléphones portables. Je suppose donc que le meilleur moyen est de faire des vérifications.

0 votes

Omg, Android comme d'habitude nous réserve des surprises. Merci pour l'explication !

-1voto

RamKr Points 111

Utilisez toujours onSaveInstanceState() afin d'éviter de telles situations, qui provoqueraient des NPE en raison de données nulles provenant de l'application getIntentExtra() . Sauvegarder les données supplémentaires dans outState et le récupérer lors de l'appel onCreate() en mettant un contrôle nul pour confirmer si l'activité a été recréée ou si elle est nouvelle.
Exemple :

if (savedInstanceState != null) {
    extraData = savedInstanceState.getString(EXTRA_DATA);
} else {
    extraData = getIntent().getStringExtra(EXTRA_DATA);
}

-3voto

Sagar Nayak Points 584

Il ne peut jamais retourner une valeur nulle au moment de l'exécution. Il peut seulement donner une exception de compilation si vous voulez écrire avant que l'activité soit instanciée. donc vous devez le faire après que l'activité soit instanciée. et il donnera l'intention en retour, jamais une valeur nulle.

Les documents relatifs à Android peuvent être consultés [aquí](https://developer.android.com/reference/android/app/Activity.html#getIntent()) .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X