8 votes

Android notifier lorsque l'intent de démarrer une activité est terminé?

Je dois être capable de savoir quand une activité lancée (via un intent) est terminée, comment puis-je le faire ?

Voici ce que j'ai :

alertDialog.setButton2("Texte", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            String uri = "smsto:" + "";
            Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.parse(uri));
            intent.putExtra("sms_body", PASSWORD_GENERATOR
                    .generatePasswordForSeed(seedText, hourToUse));
            intent.putExtra("compose_mode", true);

            // -- ouvrir l'activité de messagerie texte
            startActivity(intent);

            // -- J'ai besoin de réinitialiser l'activité appelante maintenant, mais APRÈS que l'activité de messagerie texte soit terminée. Pour l'instant, le SMS se ferme immédiatement car je n'ai pas d'attente dans...
            finish();
            startActivity(getIntent());
        }
    });

MODIFICATION #1

Conformément aux suggestions ci-dessous, j'ai apporté quelques modifications. Maintenant, cependant, l'activité SMS lancée reste simplement "en attente" une fois le texte envoyé. Je n'arrive pas à comprendre comment la faire revenir à l'activité appelante. Voici ce que j'ai :

alertDialog.setButton2("Texte", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                String uri = "smsto:" + "";
                Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.parse(uri));
                intent.putExtra("sms_body", PASSWORD_GENERATOR
                        .generatePasswordForSeed(seedText, hourToUse));
                intent.putExtra("compose_mode", true);

                startActivityForResult(intent, Activity.RESULT_OK);

                registerReceiver(new BroadcastReceiver() {
                    @Override
                    public void onReceive(Context context, Intent intent) {
                        finish();
                        startActivity(getIntent());
                    }

                }, new IntentFilter("SMS_SENT"));

                ContentResolver contentResolver = getContentResolver();
                Handler handler = new Handler();

                contentResolver.registerContentObserver(Uri
                        .parse("content://sms"), true, new ContentObserver(
                        handler) {

                    @Override
                    public boolean deliverSelfNotifications() {
                        setResult(Activity.RESULT_OK);
                        finish();

                        return super.deliverSelfNotifications();
                    }

                    @Override
                    public void onChange(boolean selfChange) {
                        super.onChange(selfChange);

                        setResult(Activity.RESULT_OK);
                        finish();
                    }
                });
            }
        });

        alertDialog.show();
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        finish();
        startActivity(getIntent());
    }

12voto

Nikola Despotoski Points 13670

Utiliser startActivityForResult(intent, entierpositif);

Faites ce que vous voulez faire dans l'activité lancée quand vous pensez que l'activité s'est terminée avec succès, faites setResult(Activity.RESULT_OK); finish();

Et dans l'activité qui a été lancée, remplacez la méthode onActivityResult(). Et testez si votre activité appelée a terminé son travail.

Ne jamais jamais jamais jamais utiliser Activity.RESULT_OK pour requestCode, car c'est une constante négative. Et la documentation indique que la méthode onActivityResult() sera appelée pour chaque entier positif requestCode:

Réécrivez et suivez ceci

Comment démarrer l'activité pour obtenir un résultat:

      static final int RESULTAT_STATIC=2; //entier positif > 0.
      Intent i = new Intent("mon.activite.lancerNouvelle");
      i.putExtra("catégorie", catégorie);
    startActivityForResult(i, RESULTAT_STATIC);

Dans votre activité lancerNouvelle, vous terminez avec le résultat comme suit:

    //après que le travail est fait, utilisez la méthode que j'ai mentionnée dans les commentaires pour vérifier si le SMS est bien envoyé/soumis. et procédez si c'est vrai avec ceci
    if(objetSMS.getStatut()==0)//selon la documentation signifie envoyé avec succès
{
    Intent i = getIntent(); //récupérez l'intent qui a été appelé, c'est-à-dire que vous avez appelé avec startActivityForResult();
    i.putExtras(b);//ajoutez des données, dans un bundle
    setResult(Activity.RESULT_OK, i);  //maintenant, vous pouvez utiliser Activity.RESULT_OK, peu importe ce que vaut le resultCode    
    finish(); //terminez l'activité lancerNouvelle
}

Comment utiliser la méthode onActivityResult():

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {

          if (requestCode == RESULTAT_STATIC) //vérifiez si le code de demande est celui que vous avez envoyé
          {
                 if (resultCode == Activity.RESULT_OK) 
                 {
                // mission réussie, faites quelque chose avec cela.

                 {
                 } else
                         // le code de résultat est différent de celui avec lequel vous avez terminé, faites quelque chose d'autre.
                     }
          }

        super.onActivityResult(requestCode, resultCode, data);

    }

5voto

WindsurferOak Points 1841

Réponse de suivi pour la deuxième question : Par curiosité, avez-vous envisagé d'envoyer le texte sans créer une activité? La raison pour laquelle je pose cette question est parce qu'il semble, d'après ce que je peux voir, qu'aucune expérience utilisateur ne se déroule dans votre activité SMS. Si vous n'avez pas de vues et d'interactions utilisateur, peut-être qu'il suffirait simplement de définir un thread ou de créer une classe d'aide.

Réponse originale pour la première question : Essayez d'utiliser startActivityForResult(Intent, int). Votre activité actuelle peut être notifiée lorsque l'activité d'envoi de messages texte se termine.

2voto

Sherif elKhatib Points 23987

Malheureusement, vous devrez utiliser SmsManager

Utilisez ceci : SMS Messaging in Android | mobiForge

Vous pouvez recevoir le SMS_SENT

Note : Assurez-vous de redémarrer votre activité d'appel en utilisant onCreate()

1voto

karl Points 669

Pour répondre à votre nouvelle question, vous pouvez ajouter exit_on_sent à l'intention, ce qui provoquera le retour de l'activité SMS après l'envoi d'une invitation.

smsIntent.putExtra("exit_on_sent", true);

Malheureusement, il semble que cela renvoie toujours un resultCode de Activity.RESULT_CANCELLED, que vous le fassiez de cette façon ou si l'utilisateur appuie sur le bouton retour, donc vous ne pouvez pas savoir si l'utilisateur a réellement envoyé le texte ou non.

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