60 votes

Utilisation de ResultReceiver sous Android

Fondamentalement, je voudrais établir un rappel à l'Activité d'une IntentService. Ma question est très similaire à la réponse ici:

Android: API restful service

Cependant, dans le code de réponse, le code d'activité est considérée comme mise en œuvre d'un ResultReceiver. À moins que je me manque quelque chose, ResultReceiver est en fait une classe, il ne peut donc pas effectuer cette mise en œuvre.

Donc en gros, je me demande quelle serait la bonne façon de câbler un ResultReceiver à ce service. Je m'embrouille avec le Gestionnaire et ResultReceiver concepts à cet égard. Tout travail exemple de code serait appréciée.

118voto

SohailAziz Points 1873
  1. Vous avez besoin de faire de la coutume resultreceiver classe étendue de ResultReceiver

  2. puis met en œuvre la resultreceiver interface de votre activité

  3. Passer personnalisé resultreceiver objet de intentService et dans intentservice extraire seulement l'objet de récepteur et d'appel le récepteur.send() fonction permettant d'envoyer quoi que ce soit à l'appel de l'activité dans Faisceau objet.

    voici customResultReceiver classe :

     public class MyResultReceiver extends ResultReceiver {
    
        private Receiver mReceiver;
    
        public MyResultReceiver(Handler handler) {
            super(handler);
            // TODO Auto-generated constructor stub
        }
    
        public interface Receiver {
            public void onReceiveResult(int resultCode, Bundle resultData);
    
        }
    
        public void setReceiver(Receiver receiver) {
            mReceiver = receiver;
        }
    
        @Override
        protected void onReceiveResult(int resultCode, Bundle resultData) {
    
            if (mReceiver != null) {
                mReceiver.onReceiveResult(resultCode, resultData);
            }
        }
    
    }
    

met en œuvre la Myresultreceiver.récepteur d'interface en activité, créez une variable de classe

Public MyResultReceiver mReceiver;

initialiser cette variable dans onCreate:

mReceiver = new MyResultReceiver(new Handler());

mReceiver.setReceiver(this);

Passer cette mReceiver à la intentService via:

intent.putExtra("receiverTag", mReceiver);

et chercher dans IntentService comme:

ResultReceiver rec = intent.getParcelableExtra("receiverTag");

et envoyer quoi que ce soit à l'activité à l'aide de rec comme:

Bundle b=new Bundle();
rec.send(0, b);

ce sera reçue en onReceiveResult de l'activité. Vous pouvez afficher le code complet à:IntentService: Fournir des données de retour à l'Activité

Edit: Vous devez appeler setReceiver(ce) dans onResume et setReceiver(null) dans onPause() pour éviter les fuites.

23voto

Vous substituez une méthode en sous-classant. Il n'est pas nécessaire que ce soit une interface.

Par exemple:

 intent.putExtra(StockService.REQUEST_RECEIVER_EXTRA, new ResultReceiver(null) {
    @Override
    protected void onReceiveResult(int resultCode, Bundle resultData) {
        if (resultCode == StockService.RESULT_ID_QUOTE) {
            ...
        }
    }
});
 

0voto

Asahi Points 5938

Jetez un coup d'œil à ceci et à ces articles. Cela peut vous donner une idée, bien que je ne sois pas sûr de savoir pourquoi ResultReceiver est utilisé comme interface.

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