Pasar datos de la actividad al servicio usando un bash

¿Cómo obtengo datos dentro de un servicio de Android que se pasó de una actividad invocadora?

Primer contexto (puede ser actividad / servicio, etc.)

Tienes pocas opciones:

1) Utiliza el paquete del bash :

Intent mIntent = new Intent(this, Example.class); Bundle extras = mIntent.getExtras(); extras.putString(key, value); 

2) Crea un nuevo paquete

 Intent mIntent = new Intent(this, Example.class); Bundle mBundle = new Bundle(); mBundle.extras.putString(key, value); mIntent.putExtras(mBundle); 

3) Use el método abreviado putExtra () de la intención

 Intent mIntent = new Intent(this, Example.class); mIntent.putExtra(key, value); 

Nuevo contexto (puede ser actividad / servicio, etc.)

 Intent myIntent = getIntent(); // this getter is just for example purpose, can differ if (myIntent !=null && myIntent.getExtras()!=null) String value = myIntent.getExtras().getString(key); } 

NOTA: Los paquetes tienen métodos de “obtener” y “poner” para todos los tipos primitivos, Parcelables y Serializables. Acabo de utilizar cadenas con fines de demostración.

Para obtener una respuesta precisa a esta pregunta sobre “Cómo enviar datos a través de la intención de una actividad a un servicio”, es necesario anular el método onStartCommand() , que es donde se recibe el objeto intencionado:

Cuando crea un Service , debe anular el método onStartCommand() , de modo que si observa detenidamente la firma a continuación, aquí es donde recibe el objeto de intent que se le pasa:

  public int onStartCommand(Intent intent, int flags, int startId) 

Por lo tanto, a partir de una actividad creará el objeto de intención para iniciar el servicio y luego colocará sus datos dentro del objeto de intención, por ejemplo, quiere pasar un UserID de UserID de la Activity al Service :

  Intent serviceIntent = new Intent(YourService.class.getName()) serviceIntent.putExtra("UserID", "123456"); context.startService(serviceIntent); 

Cuando se inicia el servicio, se onStartCommand() método onStartCommand() , por lo que en este método puede recuperar el valor (UserID) del objeto intent por ejemplo

 public int onStartCommand (Intent intent, int flags, int startId) { String userID = intent.getStringExtra("UserID"); return START_STICKY; } 

Nota: la respuesta anterior especifica para obtener un método Intento con getIntent() que no es correcto en el contexto de un servicio

Si vincula su servicio, obtendrá Extra en onBind(Intent intent) .

Actividad:

  Intent intent = new Intent(this, LocationService.class); intent.putExtra("tour_name", mTourName); bindService(intent, mServiceConnection, BIND_AUTO_CREATE); 

Servicio:

 @Override public IBinder onBind(Intent intent) { mTourName = intent.getStringExtra("tour_name"); return mBinder; } 

Otra posibilidad es usar intent.getAction:

En servicio:

 public class SampleService inherits Service{ static final String ACTION_START = "com.yourcompany.yourapp.SampleService.ACTION_START"; static final String ACTION_DO_SOMETHING_1 = "com.yourcompany.yourapp.SampleService.DO_SOMETHING_1"; static final String ACTION_DO_SOMETHING_2 = "com.yourcompany.yourapp.SampleService.DO_SOMETHING_2"; static final String ACTION_STOP_SERVICE = "com.yourcompany.yourapp.SampleService.STOP_SERVICE"; @Override public int onStartCommand(Intent intent, int flags, int startId) { String action = intent.getAction(); //System.out.println("ACTION: "+action); switch (action){ case ACTION_START: startingService(intent.getIntExtra("valueStart",0)); break; case ACTION_DO_SOMETHING_1: int value1,value2; value1=intent.getIntExtra("value1",0); value2=intent.getIntExtra("value2",0); doSomething1(value1,value2); break; case ACTION_DO_SOMETHING_2: value1=intent.getIntExtra("value1",0); value2=intent.getIntExtra("value2",0); doSomething2(value1,value2); break; case ACTION_STOP_SERVICE: stopService(); break; } return START_STICKY; } public void startingService(int value){ //calling when start } public void doSomething1(int value1, int value2){ //... } public void doSomething2(int value1, int value2){ //... } public void stopService(){ //...destroy/release objects stopself(); } } 

En actividad:

 public void startService(int value){ Intent myIntent = new Intent(SampleService.ACTION_START); myIntent.putExtra("valueStart",value); startService(myIntent); } public void serviceDoSomething1(int value1, int value2){ Intent myIntent = new Intent(SampleService.ACTION_DO_SOMETHING_1); myIntent.putExtra("value1",value1); myIntent.putExtra("value2",value2); startService(myIntent); } public void serviceDoSomething2(int value1, int value2){ Intent myIntent = new Intent(SampleService.ACTION_DO_SOMETHING_2); myIntent.putExtra("value1",value1); myIntent.putExtra("value2",value2); startService(myIntent); } public void endService(){ Intent myIntent = new Intent(SampleService.STOP_SERVICE); startService(myIntent); } 

Finalmente, en el archivo Manifest:

         

Actividad:

 int number = 5; Intent i = new Intent(this, MyService.class); i.putExtra("MyNumber", number); startService(i); 

Servicio:

 @Override public int onStartCommand(Intent intent, int flags, int startId) { if (intent != null && intent.getExtras() != null){ int number = intent.getIntExtra("MyNumber", 0); } } 

Servicio: el servicio de inicio puede causar efectos secundarios, la mejor forma de utilizar el messenger y pasar datos.

 private CallBackHandler mServiceHandler= new CallBackHandler(this); private Messenger mServiceMessenger=null; //flag with which the activity sends the data to service private static final int DO_SOMETHING=1; private static class CallBackHandler extends android.os.Handler { private final WeakReference mService; public CallBackHandler(Service service) { mService= new WeakReference(service); } public void handleMessage(Message msg) { //Log.d("CallBackHandler","Msg::"+msg); if(DO_SOMETHING==msg.arg1) mSoftKeyService.get().dosomthing() } } 

Actividad: Obtener Messenger de la intención llenarlo pasar datos y pasar el mensaje de vuelta al servicio

 private Messenger mServiceMessenger; @Override protected void onCreate(Bundle savedInstanceState) { mServiceMessenger = (Messenger)extras.getParcelable("myHandler"); } private void sendDatatoService(String data){ Intent serviceIntent= new Intent(BaseActivity.this,Service.class); Message msg = Message.obtain(); msg.obj =data; msg.arg1=Service.DO_SOMETHING; mServiceMessenger.send(msg); }