2011-01-30 2 views

Respuesta

1

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.

+0

su enlace no funciona ... –

+0

@RajaReddyPolamReddy gracias! Lo arreglé. –

+1

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

0

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.

+4

¿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

+0

@Juri http://stackoverflow.com/questions/1916253/bind-service-to-activity-in-android de la nada se ha vinculado – CrandellWS

24

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.

35

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

excelente respuesta ... – Opiatefuchs

+0

si el servicio se detiene forzadamente, ¿recibiré una llamada a onServiceDisconnected? –

+9

por qué es tan difícil llamar a una simple operación –

Cuestiones relacionadas