0

J'essaie d'implémenter une méthode où mon application suivra lorsqu'un utilisateur a ouvert ou fermé mon application en mettant à jour une base de données mongodb. Je comprends que lorsqu'une activité démarre, les méthodes onCreate() ou onResume() démarrent toujours et lorsqu'une activité se ferme, les méthodes onPause() ou onStop() appellent.Suivre l'utilisateur lors de la fermeture/démarrage de l'application

Ce que j'ai essayé est jusqu'à présent ceci: dans toutes les activités de ma demande, j'appelle ce AsyncTask:

public void updateOnline(String fbid, boolean login){ 
    new updateOnlineAsync(fbid, login).execute(); 
} 

public class updateOnlineAsync extends AsyncTask<Void, Void, Void>{ 
    String fbid; 
    boolean login; 

    public updateOnlineAsync(String fbid, boolean login){ 
     this.fbid=fbid; 
     this.login=login; 
    } 


    @Override 
    protected Void doInBackground(Void... params) { 
     BasicDBObject query = new BasicDBObject(); 
     query.put("fbid", this.fbid); 
     Document myDoc = fb_users.find(query).first(); 

     if(login){ 
      Log.d("...", "x"); 
      Document listItem = new Document("online", "0"); 
      Document updateQuery = new Document("$set", listItem); 
      fb_users.updateOne(myDoc, updateQuery); 
     }else{ 
      Log.d("...", "y"); 
      Document listItem = new Document("online", "1"); 
      Document updateQuery = new Document("$set", listItem); 
      fb_users.updateOne(myDoc, updateQuery); 
     } 
     return null; 
    } 
} 

Sur les méthodes onCreate(), onResume() i utilise:

ServerRequest serverRequest = new ServerRequest(this); 
Profile profile = Profile.getCurrentProfile(); 
serverRequest.updateOnline(profile.getId(), false); 

et OnPause(), onStop() méthodes i utilise:

ServerRequest serverRequest = new ServerRequest(this); 
Profile profile = Profile.getCurrentProfile(); 
serverRequest.updateOnline(profile.getId(), true); 

Je pense que cela devrait fonctionner et mettre à jour mon document d'esprit h la situation en ligne/hors ligne de l'utilisateur, mais ce n'est pas le cas. Je me demande si cela est dû au fait qu'AsyncTask ne fonctionne pas lorsque l'application est en arrière-plan ou que je fais quelque chose de mal. De toute façon toute aide est très appréciée.

EDIT

Log.d() dans AsyncTask ptints y mais pas x. Là pour le AsyncTask s'exécute pour la méthode onCreate(), mais pas pour onStop()

Je viens de tester en changeant d'activité dans mon application. Le champ en ligne est mis à jour dans ma base de données lorsque je modifie une activité dans mon application ou lorsque j'appuie sur le bouton du milieu de mon smartphone (l'envoyer en arrière-plan). La méthode ne fonctionne pas seulement quand je la ferme complètement

+0

Sans voir ce que 'BasicDBObject' est, il pourrait y avoir un problème. Mais si votre journal frappe le bloc 'y' mais pas le 'x', êtes-vous sûr d'appeler 'updateOnline()' avec une vraie valeur pour le login? Avez-vous débogué l'application et parcouru le code ligne par ligne? La valeur des variables était-elle celle que vous attendiez à chaque étape? –

+0

Je viens de tester en changeant d'activité dans mon application.Le champ en ligne est mis à jour dans ma base de données lorsque je modifie une activité dans mon application ou lorsque j'appuie sur le bouton du milieu de mon smartphone (l'envoyer en arrière-plan). La méthode ne fonctionne pas seulement quand je la ferme complètement –

Répondre

2

La version courte est que "you should avoid performing CPU-intensive work during onPause(), such as writing to a database". Ceci est de managing the activity lifecycle (qui est une lecture recommandée). Cependant, comme vous et d'autres l'ont noté, la suspension et l'arrêt d'une application n'arrêtent pas les threads d'arrière-plan. Lorsque vous fermez complètement l'application, onDestroy est appelée. Cela tue tout (comme son nom l'indique). De même, la suspension de l'activité implique que l'interface utilisateur est partiellement masquée. Cela peut arriver lorsqu'une fenêtre d'alerte est affichée au-dessus. Cependant, la plupart des cas de onPause se produisent juste avant onStop. Si l'application est toujours en cours d'exécution ou non, "Une fois que votre activité est arrêtée, le système peut détruire l'instance si elle doit récupérer la mémoire système."

Notez que la recommandation d'éviter une utilisation intensive de la CPU lors d'onPause ne s'applique pas à onStop. Google's example shows writing to storage. Ce n'est pas spécifié ici mais j'imagine que c'est une mauvaise idée de générer un thread d'arrière-plan pour faire cela, car le système peut supposer que l'activité est prête pour onDestroy une fois que onStop existe.

Ma recommandation d'origine est toujours valable. Si vous créez un Service, onDestroy sur une activité ne s'applique pas.

+0

_ "après avoir exécuté onPause et onClose, l'application est fermée" _ Ce n'est pas vrai. _ "y compris tout fil de fond de l'activité" _ Ce n'est pas vrai. – Onik

+0

que voulez-vous dire ouvrir un service? comme appeler un fichier php par exemple? –

+0

également, lorsque l'activité passe en arrière-plan, la tâche fonctionne correctement, le champ est mis à jour dans ma base de données. Le champ n'est pas mis à jour uniquement lorsque je ferme complètement l'application –