2010-02-16 15 views
12

que tienen el método folowing en un servicio en mi appplication:Android: ¿usa el método de un servicio en una actividad?

public void switchSpeaker(boolean speakerFlag){ 

     if(speakerFlag){ 
     audio_service.setSpeakerphoneOn(false); 
     } 
     else{ 
     audio_service.setSpeakerphoneOn(true); 
     } 

    } 

Así que mi pregunta es ¿cuál es la mejor y más eficaz manera de poder utilizar este método en una actividad como sigue

final Button speaker_Button = (Button) findViewById(R.id.widget36); 

      speaker_Button.setOnClickListener(new View.OnClickListener(){ 
       public void onClick(View v){ 

        switchSpeaker(true); //method from Service 

       } 

      }); 

¿Tengo que hacer una AIDL o hay una manera más simple?

Respuesta

3

Tiene que exponer el servicio switchSpeaker método para los clientes. Defina su archivo .aidl. Que se unen a ese servicio desde su actividad y simplemente llame al switchSpeaker. Ver documentation

Ninguna otra forma sencilla de llamar a este método, sólo si estática)

+1

Para .aidl tenemos que manejar multi-threading y así que esto no es una forma correcta de poner en práctica el ayuda para usar un servicio local. En lugar de eso, hay otras dos opciones que podemos usar y esas son Usar IBinder y Usar Messanger. IBinder será mejor si hay un servicio local vinculante con la actividad. El enlace – Dharmendra

+1

está roto: p @ponkin – Pankaj

3

Es pública, a la derecha :)

Puede llamar al método bindService (Intención). Echa un vistazo a ApiDemos, la clase LocalServiceBinding.

En el método de devolución de llamada onServiceConnected, se puede ver:

public void onServiceConnected(ComponentName className, IBinder service) { 
     // This is called when the connection with the service has been 
     // established, giving us the service object we can use to 
     // interact with the service. Because we have bound to a explicit 
     // service that we know is running in our own process, we can 
     // cast its IBinder to a concrete class and directly access it. 
     mBoundService = ((LocalService.LocalBinder)service).getService(); 

     // Tell the user about this for our demo. 
     Toast.makeText(LocalServiceBinding.this, R.string.local_service_connected, 
       Toast.LENGTH_SHORT).show(); 
    } 

Ahora, utilice el objeto de servicio (mBoundService) para llamar al método.

Eso es todo :)

+0

pero luego se convertirá en un servicio delimitado y no podré usarlo incluso después de que se destruya el componente de la actividad ... ¿de otra manera? –

+0

Si desea que el servicio siga funcionando en segundo plano cuando la actividad se destruye, puede comenzar el servicio normalmente sin vincularlo a su actividad. Luego, para llamar al método desde el servicio, en lugar de llamar directamente, puede llamar a startService con Intent tiene una acción predefinida o datos adicionales, ya sea que el servicio ya se esté ejecutando o no, se invocará el método onStartCommand -> verifique el intento y llama al método que quieras si el intento coincide. La diferencia clave aquí es que esta llamada es asincrónica y no se puede obtener el resultado del método directamente. –

68

Existen 3 formas de enlace de servicio con su actividad.

  1. IBinder Implementación
  2. El uso de Messenger
  3. Usando AIDL

Entre estos IBinder implementación es el mejor traje en su caso

Ejemplo de clase IBinder

1. Server.java Servicio

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 void switchSpeaker(boolean speakerFlag){ 

     if(speakerFlag){ 
     audio_service.setSpeakerphoneOn(false); 
     } 
     else{ 
     audio_service.setSpeakerphoneOn(true); 
     } 

    } 
} 

2. Actividad Client.java

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) { 
      mServer.switchSpeaker(true); 
     } 
    }); 

} 

@Override 
protected void onStart() { 
    super.onStart(); 
    Intent mIntent = new Intent(this, Server.class); 
bindService(mIntent, mConnection, BIND_AUTO_CREATE); 
}; 

ServiceConnection mConnection = new ServiceConnection() { 

    public void onServiceDisconnected(ComponentName name) { 
     Toast.makeText(Client.this, "Service is disconnected", 1000).show(); 
     mBounded = false; 
     mServer = null; 
    } 

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

Ejemplo de clase Messenger

1. servicio Server.java

public class Server extends Service{ 

    Messenger messenger = new Messenger(new LocalHandler()); 
    Messenger clientMessenger; 
    static final int SysterTime = 0; 
    static final int AddHandler = 1; 
    List<Handler> mHandlers; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     mHandlers = new ArrayList<Handler>(); 
    } 

    @Override 
    public IBinder onBind(Intent intent) { 
     return messenger.getBinder(); 
    } 

    public class LocalHandler extends Handler { 

     @Override 
     public void handleMessage(Message msg) { 
      switch (msg.what) { 
      case SysterTime: 
       SimpleDateFormat mDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
       try { 
        clientMessenger.send(Message.obtain(null, SysterTime, mDateFormat.format(new Date()))); 
       } catch (RemoteException e) { 
        e.printStackTrace(); 
       } 
       break; 

      case AddHandler: 
       clientMessenger = new Messenger((Handler) msg.obj); 
       try { 
        clientMessenger.send(Message.obtain(null, AddHandler, "Registed messanger")); 
       } catch (RemoteException e) { 
        e.printStackTrace(); 
       } 
       break; 

      default: 
       break; 
      } 
      super.handleMessage(msg); 
     } 
    } 
} 

2. Cliente.java Actividad

public class Client extends Activity { 

    Messenger messenger; 
    boolean mBounded; 
    TextView text; 
    Button button; 
    Button register; 


    @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) { 

       Message message = Message.obtain(null, Server.SysterTime, null); 
       try { 
        messenger.send(message); 
       } catch (RemoteException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
     }); 

     register = (Button) findViewById(R.id.register); 
     register.setOnClickListener(new OnClickListener() { 

      public void onClick(View v) { 

       Message message = Message.obtain(null, Server.AddHandler, new ClientHandle()); 
       try { 
        messenger.send(message); 
       } catch (RemoteException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
     }); 

    } 


    public class ClientHandle extends Handler { 

     @Override 
     public void handleMessage(Message msg) { 

      switch (msg.what) { 
      case Server.SysterTime: 
       text.setText(msg.obj.toString()); 
       break; 

      case Server.AddHandler: 
       text.setText(msg.obj.toString()); 
       break; 

      default: 
       break; 
      } 

      super.handleMessage(msg); 
     } 


    } 

    @Override 
    protected void onStart() { 
     super.onStart(); 

     bindService(new Intent(this, Server.class), mConnection, BIND_AUTO_CREATE); 
    } 



    @Override 
    protected void onStop() { 
     super.onStop(); 
     if(mBounded) { 
      unbindService(mConnection); 
     } 
    } 



    ServiceConnection mConnection = new ServiceConnection() { 

     public void onServiceDisconnected(ComponentName name) { 
      mBounded = false; 
      messenger = null; 
     } 

     public void onServiceConnected(ComponentName name, IBinder service) { 
      Toast.makeText(Client.this, "Service is connected", 1000).show(); 
      messenger = new Messenger(service); 
      mBounded = true; 
     } 
    }; 
} 

Ejemplo de AIDL

1. IRemoteService.aidl

package com.example.bindservice.aidl; 

interface IRemoteService { 

    String getMessage(String msg); 
} 

2. Servicio Server.java

public class Server extends Service{ 

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

    IRemoteService.Stub mStub = new IRemoteService.Stub() { 

     public String getMessage(String msg) throws RemoteException { 
      return msg; 
     } 
    }; 
} 

3. Actividad Client.java

public class Client extends Activity { 

    Button button; 
    TextView text; 
    boolean mBound; 
    IRemoteService mIRemoteService; 
    EditText etMsg; 

    @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); 
     etMsg = (EditText)findViewById(R.id.etMsg); 
     button.setOnClickListener(new OnClickListener() { 

      public void onClick(View v) { 

       if(mBound) { 
        try { 
         text.setText(mIRemoteService.getMessage(etMsg.getText().toString())); 
        } catch (RemoteException e) { 
         e.printStackTrace(); 
        }     
       } 
      } 
     }); 
    } 

    @Override 
    protected void onStart() { 
     super.onStart(); 
     bindService(new Intent(Client.this, Server.class), mConnection, BIND_AUTO_CREATE); 
    } 

    @Override 
    protected void onStop() { 
     super.onStop(); 
     if(mBound) { 
      unbindService(mConnection); 
      mBound = false; 
     } 
    } 

    ServiceConnection mConnection = new ServiceConnection() { 

     public void onServiceDisconnected(ComponentName name) { 
      mIRemoteService = null; 
      mBound = false; 
     } 

     public void onServiceConnected(ComponentName name, IBinder service) { 
      mIRemoteService = IRemoteService.Stub.asInterface(service); 
      mBound = true; 
     } 
    }; 
} 

Para más estudio se puede hacer referencia this document

+3

buenos ejemplos allí! –

+0

Estoy usando el ejemplo 3 usando aidl, obteniendo la excepción de puntero nulo aquí String a = mIRemoteService.getMessage ("msg"); –

+0

@RajaReddyPolamReddy Haga una nueva pregunta con su código para que pueda obtener más y mejores respuestas. – Dharmendra

Cuestiones relacionadas