Bienvenidos sean a este post, hoy hablaremos sobre un metodo visto en el ejemplo del post anterior, este metodo fue implementado a partir de la API 5 en reemplazo del metodo onStart(). Este metodo se inicializa siempre que sea llamado por medio de startService(), su sintaxis es:

public int onStartCommand(Intent intencion, int flags, int idArranque)
Anuncios

Los atributos del metodos tienen las siguientes caracteristicas:

  • intencion, un objeto de tipo Intent que se indico en la llamada startService(Intent)
  • flags, indica como iniciar el servicio, este valor puede ser 0, START_FLAG_REDELIVERY o START_FLAG_RETRY. Cualquier valor distinto de cero se utiliza para reiniciar un servicio tras detectar algun problema
  • idArranque, un entero unico que representa la solicitud de inicio especifico. Este valor es utilizado para el metodo stopSelfResult(int idArranque)

Nuestra siguiente descripcion es sobre los posibles valores que puedan devolver, el valor devuelto le dice al sistema como debe comportarse cuando un servicio sea eliminado despues de inicializado, los siguientes valores estan permitidos:

  • START_STICKY, esto es para indicarle al sistema que intente recrear el servicio en caso de haber sido eliminado, en este caso se volvera a llamar al onStartCommand() pero en intencion ira un valor null.
  • START_NOT_STICKY, al contrario del caso anterior en este caso le indicaremos al sistema que no vuelva a recrear el servicio, por lo tanto en este caso intencion no va a ser null.
  • START_REDELIVER_INTENT, el sistema intentara volver a crear el servicio y el parametro intencion sera el que se utilizo en la ultima llamada startService(Intent)
  • START_STICKY_COMPATIBILITY, una version compatible de START_STICKY la cual no garantiza que onStartCommand() sea llamado despues que el proceso sea eliminado

A continuacion haremos un ejemplo para extender un poco mas el concepto de onStartCommand() para la clase Service, en nuestro Android Studio creemos una nueva app con las siguientes caracteristicas:

  • Application Name: Intentservice
  • Domain Company: example.org
  • Minimum API SDK (Phone and Tablet): 14
  • Add an Activity: Empty Activity

Una vez generada nuestra app debemos modificar el archivo activity_main.xml con el siguiente codigo:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <EditText
            android:id="@+id/entrada"
            android:layout_width="0dip"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:inputType="numberDecimal"
            android:text="2.2" />
        <requestFocus />
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="calcularOperacion"
            android:text="Calcular operacion" />
    </LinearLayout>
    <TextView
        android:id="@+id/salida"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text=" "
        android:textAppearance="?android:attr/textAppearanceMedium"/>

</LinearLayout>

En este caso crearemos tres elementos uno de entrada, otro de salida y un boton para realizar el calculo y mostrar el resultado en salida de lo ingresado en entrada, pasemos a la clase MainActivity y modifiquemos la misma con el siguiente codigo:

Anuncios
package org.example.intentservice;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends Activity {
    public EditText entrada;
    public static TextView salida;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        entrada = (EditText) findViewById(R.id.entrada);
        salida = (TextView) findViewById(R.id.salida);
    }

    public void calcularOperacion(View view){
        double n = Double.parseDouble(entrada.getText().toString());
        salida.append(n + "^2 = ");
        Intent i = new Intent(this,ServicioOperacion.class);
        i.putExtra("numero", n);
        startService(i);
    }
}

En este caso primero crearemos los objetos para los elementos entrada y salida, luego en onCreate() crearemos los vinculos entre el codigo java y los elementos, despues tendremos el metodo calcularOperacion() el cual se encargara de crear una nueva intencion donde utilizara la clase ServicioOperacion, la cual aun no existe, y luego por medio de putExtra enviara la informacion ingresada en entrada y por ultimo ejecutaremos por medio de startService() nuestra intencion pero a su vez crearemos el servicio, nuestro siguiente paso sera crear una nueva clase Java para ello deben hacer click con el boton derecho sobre el contenedor de las clases javas y seleccionar New -> Java class, una vez hecho deberan completar el campo Name con ServicioOperacion, el resto dejenlo como se aparece y pulsen Ok para crear la nueva clase. Con nuestra nueva clase creada procedamos a modificarla con el siguiente codigo:

package org.example.intentservice;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.SystemClock;

public class ServicioOperacion extends Service {

    @Override
    public int onStartCommand(Intent i, int flags, int idArranque){
        double n = i.getExtras().getDouble("numero");
        SystemClock.sleep(5000);
        MainActivity.salida.append(n * n + "\n");
        return START_NOT_STICKY;
    }

    @Override
    public IBinder onBind(Intent args){
        return null;
    }
}

En esta clase extenderemos el uso de Service, donde en onStartCommand() recibiremos el valor enviado por medio de la intencion, despues crearemos una espera de 5s (5000ms) para luego multiplicar entre si el valor enviado para obtener el cuadrado del mismo y lo agregaremos al vinculo llamado salida de MainActivity para mostrarlo en pantalla, por ultimo sobreescribiremos el metodo onBind() para que devuelva un valor nulo. Antes de probar nuestra app debemos agregar dentro del archivo AndroidManifest.xml el siguiente permiso dentro de las etiquetas application:

<service android:name=".ServicioOperacion" />

Con esto concederemos la posibilidad de ser utilizado como servicio, una vez hecha esta modificacion AndroidManifest.xml nos quedara de la siguiente forma:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="org.example.intentservice">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action
                    android:name="android.intent.action.MAIN" />

                <category 
                    android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <service android:name=".ServicioOperacion" />
    </application>

</manifest>

Si probamos nuestra app, obtendremos un resultado como se ve en el siguiente video

Como pueden ver en el video cuando pulsamos el boton Calcular Operacion creara una nueva intencion y ejecutara una actividad relacionada a la clase ServicioOperacion y a su vez enviaremos la informacion almacenada en el EditText llamado entrada, esta actividad por medio de onStartCommand() recibira el valor a elevar al cuadrado, lo procesara, esperara 5s (5000ms) y lo asignara al elemento salida.

Anuncios

Esta es una descripcion del metodo onStartCommand() como podemos utilizarlo, que valores puede devolver, en base a los valores que accion tomara el sistema operativo, el ejemplo nos muestra como podemos recibir un dato y luego devolver al cuerpo principal, espero les haya sido util sigueme en Twitter, Facebook o Google+ para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Tambien podes donar

Es para mantenimiento del sitio, gracias!

$1.00