2011-12-23 6 views
0

J'ai essayé de jeter un coup d'œil au cycle de vie de l'acitivité, mais je ne comprends toujours pas où placer mon code.Besoin d'aide pour comprendre où mettre un morceau de code, onCreate()/OnStart

  1. Dans mon onCreate() je reçois l'emplacement GPS.
  2. Un peu plus tard dans l'application, le Camera Intent est appelé, puis est ignoré.
  3. L'emplacement GPS est récupéré à nouveau (je suppose que onCreate() est effectuée à nouveau?)

Je veux seulement l'emplacement GPS à récupérer une fois, au début de l'application une fois commencé.

+0

Je pense que j'ai aussi rencontré ce problème, et cela a à voir avec la façon dont vous avez lancé une autre activité (quelle que soit l'activité qui accepte Camera Intents). Je pense que ce qui se passe est normalement dans votre propre activité, seuls onStart() et onStop() sont appelés. mais je suppose que puisque votre application n'est pas temporairement la meilleure application, android décide d'appeler onCreate() la prochaine fois que votre application est en "focus". ** corrigez-moi si je me trompe ici, je ne fais que spéculer ** –

+0

sur une autre note, êtes-vous sûr de vouloir obtenir l'emplacement GPS dans "onCreate()"? cela ressemble à quelque chose qui est plus d'un service d'arrière-plan, dans lequel vous vérifiez d'abord si vous avez déjà obtenu l'emplacement GPS. –

+0

@DavidT. J'ai absolument besoin de l'emplacement GPS lors de la création de l'application car il doit enregistrer l'emplacement de l'utilisateur au moment où il commence à l'utiliser. – Neeta

Répondre

0

Voir my answer about why you can't just "get" a GPS position pour un arrière-plan. Obtenir la position GPS une fois dans votre méthode onCreate() (avec des vérifications d'initialisation paresseuses pour voir si vous avez déjà la coordonnée GPS en cas d'appels multiples à onCreate()) peut ne pas être la bonne approche pour votre application, et pourrait causer votre application doit être fermée de force par le système d'exploitation Android.

Si vous avez déterminé que le dernier emplacement connu du périphérique est toujours suffisant pour votre application, l'appel à chaque fois que votre méthode onCreate() est appelée est correct car il n'a pas besoin d'utiliser les circuits GPS. Par conséquent, si le dernier emplacement connu est suffisant, demandez-le simplement à chaque fois que la méthode onCreate() est appelée et évitez la complexité des contrôles sof de type initialisation paresseux.Si le dernier emplacement connu n'est pas toujours suffisant pour votre application, vous ne pouvez pas attendre le correctif dans la méthode onCreate() car vous risquez de perdre trop longtemps le repère d'emplacement, ce qui force le système Android à forcer fermez votre application qui ne répond pas car elle n'est pas revenue de la méthode onCreate() à temps. A la place, vous devez lancer une tâche asynch en arrière-plan dans la méthode onCreate() (en vérifiant que cette tâche asynchrone n'est pas exécutée) qui commence à écouter les mises à jour de localisation jusqu'à ce qu'un correctif suffisant soit reçu et se souvienne de cet emplacement. arrêter les auditeurs de localisation et ainsi éteindre les circuits GPS. Utilisez le code suivant:

private MyAsynchGpsLocationListener mGpsListener = null; 

public ... onCreate() { 
    if (mGpsListener == null) { 
    mGpsListener = new MyAsynchGpsLocationListener(); 
    mGpsListener.start(); 
    } 
} 

someMethod() { 
    if (mGpsListener != null) { 
    Location myLocation = mGpsListener.getLocation(); 
    if (myLocation != null) { 
     // Do something with a "good enough" location 
    } 
    } 
} 
1

Vous pouvez vérifier que si vous disposez déjà d'un emplacement GPS valide, vous pouvez ignorer cette étape et ne plus le récupérer. Vous pouvez utiliser SharedPreferences pour stocker cet état.

Espérons que cela aide!

+0

Vous ne voulez vraiment pas le stocker dans les préférences. Si vous le faites, vous obtiendrez le même emplacement GPS 3 semaines plus tard lorsque l'application sera à nouveau exécutée. – zmbq

+0

Bien sûr, vous devez gérer cela. Dans le onDestroy par exemple, vous devez définir cette valeur à false par exemple. Je ne voulais pas le stocker là-bas et partir pour toujours :) –

0

Vous devez enregistrer l'emplacement GPS dans les données d'instance, qui sont ensuite renvoyées à onCreate au cas où l'activité est redémarrée. Le lieu de stockage est onSaveInstance

0

Mettez-le dans onCreate() UNIQUEMENT.

Maintenant, si vous pensez qu'il est appelé plusieurs fois, vous ne pouvez pas faire quelque chose pour vérifier si vous l'avez déjà. Tels que

onCreate(){ 

//other code 

    if(GpsStuff == null) 
    { 
     //get gps position 
    } 
} 
1

Le onCreate() est appelé lors de la création de l'activité. Et le onStart() étant appelé juste après onCreate().

Vous pouvez lire sur le cycle de vie de l'activité ici: http://developer.android.com/reference/android/app/Activity.html

à votre problème, vous pouvez remplacer le onSaveInstanceState, une méthode qui vous aider à économiser un paquet, puis le récupérer dans la méthode onCreate (le paramater dans l'onCreate est ce Bundle).

protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    *Modify the bundle* 
} 

Et si vous ne pouvez pas sérialiser l'emplacement du GPS, vous pouvez utiliser:

@Override 
public Object onRetainNonConfigurationInstance() { 
    return objectYouNeed; 
} 

Et pour récupérer cette utilisation d'objets getLastNonConfigurationInstance().

J'espère que ça aide!

Questions connexes