2010-12-22 18 views
52

Fundamentalmente, me gustaría establecer una devolución de llamada a una actividad de un servicio de intendencia. Mi pregunta es muy similar a la que aquí la respuesta:Uso de ResultReceiver en Android

Restful API service

Sin embargo, en el código de respuesta, el código de actividad es vista como la implementación de un ResultReceiver. A menos que me falta algo, ResultReceiver es realmente una clase, por lo que no puede realizar esta implementación.

Básicamente, estoy preguntando cuál sería la forma correcta de conectar un receptor de resultados a ese servicio. Me confunden los conceptos de Handler y ResultReceiver con respecto a esto. Se agradecerá cualquier código de muestra que funcione.

Respuesta

98
  1. Es necesario hacer clase personalizada resultreceiver se extendía desde ResultReceiver

  2. continuación, implementa la interfaz resultreceiver en su actividad

  3. Pass objeto resultreceiver personalizada para intentService y en intentservice solo fe Seleccione el objeto receptor y llame a la función receiver.send() para enviar cualquier cosa a la actividad de llamada en el objeto Bundle.

    aquí es la clase customResultReceiver:

    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); 
         } 
        } 
    
    } 
    

implementa la interfaz Myresultreceiver.receiver en que la actividad, crear una clase variable de

Public MyResultReceiver mReceiver; 

inicializar esta variable en onCreate:

mReceiver = new MyResultReceiver(new Handler()); 

mReceiver.setReceiver(this); 

Pass this mReceiver a la intentService a través de:

intent.putExtra("receiverTag", mReceiver); 

y traiga en IntentService como:

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

y enviar nada a la actividad utilizando rec como:

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

este será recibido en onReceiveResult de la actividad. Puede ver el código completo en: IntentService: Providing data back to Activity

Editar: Usted debe llamar setReceiver (este) en onResume y setReceiver (nulo) en onPause() para evitar fugas.

+2

Esto es muy útil para mí. ¡Gracias! Buena explicación! – herbertD

+0

esta debería ser la respuesta correcta, necesita usar un controlador para ejecutar la devolución de llamada en el subproceso ui (principal). no puede modificar la interfaz de usuario si adjunta directamente un ResultReceiver a su intención. –

+1

Entonces, ¿el Revisor de resultados siempre va de la mano con un servicio de intenciones? ¿Y hay una forma menos complicada de lograr lo que hace el ResultReceiver? Quiero decir, esta arquitectura parece demasiado intrincada y tiene demasiadas dependencias circulares. –

22

Sobreescribe un método por subclases. No tiene que ser una interfaz para hacer eso.

Por ejemplo:

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

Por lo que yo puedo decir, esto solo tiene la respuesta: ¿puede mostrar el correspondiente código lateral de IntentService que desmarca el ResultReceiver para el método send()? Eso me está causando problemas. – mobibob

+0

... la mitad (sic) ... Volví y estudié el código de muestra de Google IO iosched y me di cuenta de que estaba haciendo que mi "receptor separable de resultados" fuera demasiado complicado. Resulta que, en el lado del servidor, el extra simplemente se recupera con el intent.getExtra ("receiver-key") como uno esperaría. Sin magia especial. – mobibob

+1

Es bastante simple y práctico. –

-4

para uso Resulteceiver en androide

  1. Crear SomeResultReceiver extiende desde resultReceiver

  2. Crear someReceiver interfaz con el método por ejemplo onReceivResult (resultCode int, Bundle resultData);

3.use someReceiver en someResultreceiver

  1. crear someService extiende IntentService y usar el método para resultados de envío desde el servicio de clase alguien (ex someresultReceiver.send(): MyActivity)

  2. Implementar somereceiver sobre la actividad

6.instantiation someResultR eceiver en clase MyActivity y setreceiver

  1. StartService con intención y putExtra someResultreceiver instanse

para más detalles ResultReceiver Clase ver enter link description here

3

He creado un ejemplo simple que demuestra cómo usar ResultReceiver.

MainActivity:

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; 
    } 

} 
+0

Estoy mirando el código que escribí hace dos años, y me olvidé por completo de los receptores de resultados, gracias. –