studio from fragments con comunicar change activity android android-intent android-activity service

android - from - Pasar datos de la actividad al servicio usando un intento



fragment interaction listener (6)

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

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


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:

<service android:name=".SampleService"> <intent-filter> <action android:name="com.yourcompany.yourapp.SampleService.ACTION_START"/> <action android:name="com.yourcompany.yourapp.SampleService.DO_SOMETHING_1"/> <action android:name="com.yourcompany.yourapp.SampleService.DO_SOMETHING_2"/> <action android:name="com.yourcompany.yourapp.SampleService.STOP_SERVICE"/> </intent-filter> </service>


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


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<Service> mService; public CallBackHandler(Service service) { mService= new WeakReference<Service>(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); }


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


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

Tienes pocas opciones:

1) Utiliza el Bundle del Intent :

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.