Simplemente quiero llamar a métodos de un servicio local de mi actividad. Cómo puedo hacer eso ?¿Cómo llamar a los métodos de un servicio de la actividad?
Respuesta
Una forma de hacerlo es definiendo una interfaz con Android's AIDL y haciendo uso del subsistema Binder
para realizar IPC. Hay un gran conjunto de instrucciones en el enlace que publiqué. Comenzaría allí y luego publicaría aquí si tienes preguntas. A pesar de ser un tema bastante complejo (IPC), Android y el Binder
hacen un muy buen trabajo al hacer que sea bastante simple (al menos para empezar, estoy seguro de que podrías hacerlo complicado si quisieras ;-))
Editar Como se señaló en los comentarios, esto es innecesario si el Service
y el cliente se están ejecutando en el mismo proceso. A menos que especifique lo contrario, este es el valor predeterminado. Sin embargo, todavía funciona independientemente, solo agrega un poco más de complejidad.
No sé dónde está su problema, publique un código. Usando una Carpeta, la Actividad puede tener acceso al objeto de servicio. Vea los ejemplos en la API para crear una conexión entre actividad y servicio.
Tener el objeto de servicio en su actividad, sólo tiene que llamar:
mService.yourMethod();
Podríamos ayudarlo mucho mejor si describiera exactamente su problema y, como dije, publique algunos fragmentos.
¿Por qué no poner algunos enlaces a recursos útiles? Publique algunos fragmentos de esqueleto sobre cómo enlazar un servicio y llamar a su método posteriormente? :) – Juri
@Juri http://stackoverflow.com/questions/1916253/bind-service-to-activity-in-android de la nada se ha vinculado – CrandellWS
hay código de ejemplo de este derecho en la documentación de servicio, en "Muestra de Servicio Local":
http://developer.android.com/reference/android/app/Service.html#LocalServiceSample
También para aquellas personas que sugieren AIDL - si su servicio y el cliente son parte de su propio .apk y ejecutándose en el mismo proceso (el comportamiento predeterminado), no hay necesidad de aidl; es solo una complejidad adicional que no te da nada.
Aquí es un ejemplo que puede ayudar a
Server.java:
package com.example.bindservice.binder;
import java.text.SimpleDateFormat;
import java.util.Date;
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
public class Server extends Service {
IBinder mBinder = new LocalBinder();
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
public class LocalBinder extends Binder {
public Server getServerInstance() {
return Server.this;
}
}
public String getTime() {
SimpleDateFormat mDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return mDateFormat.format(new Date());
}
}
Client.java
package com.example.bindservice.binder;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import com.example.bindservice.binder.Server.LocalBinder;
public class Client extends Activity {
boolean mBounded;
Server mServer;
TextView text;
Button button;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
text = (TextView)findViewById(R.id.text);
button = (Button) findViewById(R.id.button);
button.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
text.setText(mServer.getTime());
}
});
}
@Override
protected void onStart() {
super.onStart();
Intent mIntent = new Intent(this, Server.class);
bindService(mIntent, mConnection, BIND_AUTO_CREATE);
};
ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
Toast.makeText(Client.this, "Service is disconnected", 1000).show();
mBounded = false;
mServer = null;
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Toast.makeText(Client.this, "Service is connected", 1000).show();
mBounded = true;
LocalBinder mLocalBinder = (LocalBinder)service;
mServer = mLocalBinder.getServerInstance();
}
};
@Override
protected void onStop() {
super.onStop();
if(mBounded) {
unbindService(mConnection);
mBounded = false;
}
};
}
excelente respuesta ... – Opiatefuchs
si el servicio se detiene forzadamente, ¿recibiré una llamada a onServiceDisconnected? –
por qué es tan difícil llamar a una simple operación –
- 1. En Android: cómo llamar a la función de actividad de un servicio?
- 2. llamar a los métodos de delegado opcionales
- 3. Llamar a los métodos DLL desde Javascript
- 4. Notificar a la actividad del servicio
- 5. Llamar a un método de fragmento desde una actividad primaria
- 6. Implementando la devolución de llamada del servicio a la actividad
- 7. Cómo llamar dinámicamente a los métodos de acceso en Ruby
- 8. llamar a los métodos súper coffeescript
- 9. Android - Volver a llamar Actividad
- 10. ¿Cómo puedo llamar a los métodos del servicio web desde javascript?
- 11. Iniciar un servicio de la actividad
- 12. ¿Cómo llamar a la actividad de un proyecto de la actividad de otro proyecto en Android? ¿También viceversa?
- 13. Rendimiento de llamar a los delegados vs métodos
- 14. Transmisión de Android de Servicio a Actividad
- 15. ¿Cómo llamar a un método de servicio web?
- 16. ¿Cómo se puede llamar a la instancia de actividad de llamada Actividad?
- 17. ¿enviar emisión de Servicio a Actividad?
- 18. Cómo llamar a los métodos definidos en ApplicationController en modelos
- 19. Cómo llamar a un servicio de Windows desde asp.net
- 20. Llamar a un servicio web desde C++
- 21. cómo llamar a los métodos de extensión utilizando Eval en un control de enlace de datos
- 22. Cómo llamar a la actividad desde otro fragmento.?
- 23. ¿Cómo iniciar un servicio de Android desde una actividad y detener el servicio en otra actividad?
- 24. Android: parámetro pase a servicio desde Actividad
- 25. obtener la referencia de actividad de un servicio
- 26. El envío de datos de servicio a la actividad
- 27. ¿Cómo puedo llamar a los métodos de Java en un objeto desde una plantilla de FreeMarker?
- 28. Lanzar una excepción personalizada de un servicio a una actividad
- 29. cómo enviar mensaje del servicio a la actividad
- 30. ¿Puede un padre llamar a los métodos de la clase infantil?
su enlace no funciona ... –
@RajaReddyPolamReddy gracias! Lo arreglé. –
AIDL solo es necesario si el servicio y la actividad se encuentran en diferentes aplicaciones. Si su servicio y actividad son locales para su aplicación (que es el caso común), consulte la respuesta de @hackbod – odedfos