Utiliser ResultReceiver dans Android

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

Restful API service

cependant, dans le code de réponse, le code d'activité est considéré comme la mise en œuvre D'un réémetteur de résultat. A moins que je ne manque quelque chose, ResultReceiver est en fait une classe, donc il ne peut pas effectuer cette implémentation.

So essentiellement, je me demande quelle serait la bonne façon de raccorder un récepteur de résultat à ce service. Je me confonds avec les concepts Handler et ResultReceiver à cet égard. Tout code d'échantillon de travail serait apprécié.

57
demandé sur Community 2010-12-22 18:57:28

5 réponses

  1. vous devez faire custom resultreceiver classe étendue de ResultReceiver

  2. implémente alors l'interface resultreceiver dans votre activité

  3. Pass personnalisé resultreceiver objet de intentService et dans intentservice va chercher l'objet récepteur et appelle récepteur.envoyer () fonction pour envoyer n'importe quoi à l'activité d'appel dans Faisceau objet.

    voici customResultReceiver class:

     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 le Myresultreceiver.interface du récepteur dans votre activité, créer une variable de classe

Public MyResultReceiver mReceiver;

initialiser cette variable dans onCreate:

mReceiver = new MyResultReceiver(new Handler());

mReceiver.setReceiver(this);

passer cette livraison à l'intentService via:

intent.putExtra("receiverTag", mReceiver);

et aller chercher dans IntentService comme:

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

et envoyer quoi que ce soit à l'activité en utilisant rec comme:

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

cela sera reçu en une seule fois à la suite de l'activité. Vous pouvez visualiser le code complet à l'adresse suivante: IntentService: Providing data back to Activity

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

109
répondu SohailAziz 2014-06-03 13:35:45

vous outrepassez une méthode par subclassage. Ça n'a pas besoin d'être une interface pour faire ça.

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) {
            ...
        }
    }
});
22
répondu Eric Bowman - abstracto - 2010-12-28 21:23:51

j'ai créé un exemple simple qui montre comment utiliser ResultReceiver .

activité principale :

public class MainActivity extends AppCompatActivity {

    private final static String TAG = MainActivity.class.getSimpleName();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Intent serviceIntent = new Intent(this, MyService.class);
        serviceIntent.putExtra("logName", "MAIN_ACTIVITY");
        serviceIntent.putExtra(MyService.BUNDLED_LISTENER, new ResultReceiver(new Handler()) {
            @Override
            protected void onReceiveResult(int resultCode, Bundle resultData) {
                super.onReceiveResult(resultCode, resultData);

                if (resultCode == Activity.RESULT_OK) {
                    String val = resultData.getString("value");
                    Log.i(TAG, "++++++++++++RESULT_OK+++++++++++ [" + val + "]");
                } else {
                    Log.i(TAG, "+++++++++++++RESULT_NOT_OK++++++++++++");
                }
            }
        });
        startService(serviceIntent);
    }
}

MyService :

public class MyService extends Service {

    private final static String TAG = MyService.class.getSimpleName();
    public final static String BUNDLED_LISTENER = "listener";

    @Override
    public void onCreate() {
        super.onCreate();

    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        String logName = intent.getStringExtra("logName");
        ResultReceiver receiver = intent.getParcelableExtra(MyService.BUNDLED_LISTENER);

        Bundle bundle = new Bundle();
        bundle.putString("value", "30");
        receiver.send(Activity.RESULT_OK, bundle);
        return Service.START_NOT_STICKY;
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

}
9
répondu user2121 2017-02-04 19:58:10

je le ferais avec EventBus de nos jours

https://github.com/google/guava/wiki/EventBusExplained

-1
répondu Cícero Moura 2017-09-06 13:57:50

pour utiliser Resulteceiver dans android

  1. Créer SomeResultReceiver s'étend de resultReceiver

  2. Créer une interface someReceiver avec pour l'exemple onReceivResult(int resultCode,Bundle resultData);

3.utilisation someReceiver dans someResultreceiver

  1. créer someService s'étend IntentService et l'utilisation someresultReceiver.la méthode send() pour envoyer le résultat de service à quelqu'un de la classe (ex: MyActivity)

  2. mettre en œuvre une activité de livraison

6.l'instanciation someResultReceiver dans MyActivity classe et setreceiver

  1. startService avec l'Intention et la putExtra someResultreceiver instanse

pour plus de détails Classe resulreceiver voir entrer la description du lien ici

-4
répondu مهدی عباسپور 2015-06-29 00:23:36