web-dev-qa-db-fra.com

Comment exécuter une activité en arrière-plan dans Android

Dans mon application, je dois envoyer le message texte à l'utilisateur après un certain intervalle. Pour cela, je dois exécuter le code d'envoi du message en arrière-plan. J'utilise le gestionnaire d'alarmes pour démarrer une activité à une heure donnée. Que faire? Y a-t-il une autre façon de faire cela?

14
picaso

Vous pourriez envisager d'utiliser Services , qui sont essentiellement des activités sans interface utilisateur.

22
kaspermoerch

Pour ceux qui veulent le faire avec une activité, et non en utilisant un service (il peut y avoir des situations où cela est nécessaire), je l'ai fait en démarrant l'activité de la manière habituelle, puis dans l'activité onCreate, je l'envoyais au en appelant moveTaskToBack (true).

See Envoi d'une application en cours d'exécution à l'arrière-plan par programme

Si vous utilisez cette méthode, vous devez ajouter une information supplémentaire à l'intention par laquelle vous démarrez l'activité, afin qu'elle sache dans onCreate qu'elle doit s'envoyer en arrière-plan. Pour ce faire, vous appelez la méthode putExtra de l'intention. Dans onCreate de l'activité, vous obtenez l'intention d'appel avec getIntent, puis vous récupérez les informations que vous avez saisies avec getStringExtra, par exemple (j'ai utilisé une chaîne d'informations supplémentaires). Voir la documentation de la classe Intent.

Mise à jour août 2018: notez cependant que sur certains périphériques, votre activité peut clignoter (c'est-à-dire apparaître brièvement) à l'écran avant d'être envoyée à l'arrière-plan. Il semble que le système traite la notification pour envoyer la tâche à l'arrière-plan trop tard. Si vous appelez la méthode dans onCreate, elle devrait disposer de suffisamment de temps pour la connaître avant de dessiner la fenêtre d'activité. OMI c'est une faille système, ça ne devrait pas arriver comme ça mais ça arrive.
Donc, de toute façon, si cela vous inquiète et si vous le pouvez, vous feriez probablement mieux de le faire avec un service.

1
VSim

oui.vous devriez utiliser Service pour y parvenir.Ils peuvent être exécutés en arrière-plan jusqu'à ce qu'ils soient explicitement fermés . IntentService est une autre alternative.

http://developer.Android.com/guide/topics/fundamentals/services.html

0
drooooooid

Cela pourrait aider ... Ajouter ceci au manifeste Android ..:

uses-permission Android: name = "Android.permission.ACCESS_BACKGROUND_SERVICE"

Utilisez également AsyncClass pour vos processus longs/d’arrière-plan.

http://developer.Android.com/reference/Android/os/AsyncTask.html

0
Awais Tariq

Il est recommandé d'utiliser Service s pour atteindre cet objectif, mais j'ai rencontré une situation similaire lorsque j'ai besoin de quelque chose d'une autre application - et l'intention du service n'a pas été exportée. C'est donc le seul moyen de démarrer le programme. le service consiste à démarrer l'activité - et à garder l'utilisateur dans mon application, je dois garder mon activité au premier plan . Dans ce cas, il est possible de démarrer l'autre activité dans une AsyncTask, puis dans onPostExecute de redémarrer moi-même.

    (new AsyncTask<Void, Void, Void>() {
        boolean starting = false;
        @Override
        protected Void doInBackground(Void... params) {
            if(!externalServiceRunning()){
                Intent externalIntent = getPackageManager().getLaunchIntentForPackage("com.external...");
                if (externalIntent != null) {
                    starting = true;
                    startActivity(externalIntent);
                }
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            if(starting) {
                Intent myApp = getPackageManager().getLaunchIntentForPackage("com.my.myapp");
                if (myApp != null) {
                    startActivity(myApp);
                }
            }
        }
    }).execute();
0
Ohad Cohen