Pokud v Androidu vykonáváte větší množství operací, není vhodné tuto práci dělat v hlavním vlákně aplikace. Tuto práci musíte udělat v novém vlákně (AsynsTask) nebo ve službě (services). Dnes si ukážeme jak udělat jednoduchou službu.
Na rozdíl od aktivit běží služby na pozadí a nepotřebují uživatelské rozhraní. Služba běží paralelně s hlavním vláknem. Klasickým příkladem služby je přehrávač hudby na pozadí. Když hudba hraje, uživatel se může přepnout do jiné aplikace a přehrávání hudby se nepřeruší. Klasickým případem je stahování/odesílání dat z internetu, práce s databází, zpracování velkých souborů, přehrávání hudby,…
Služby je nutné registrovat v AndroidManifest.xml
    <application ....>
        <activity android:name=".activity.MainActivity" >
           ...
        </activity>
        <service
            android:name=".service.MyService"
            android:exported="false" >
        </service>
    </application>
Poslední dobou se mi líbí přístup definování volání služby jako statickou metodu přímo v service:
import android.app.IntentService;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import my.namespace.Config;
public class MyService extends IntentService {
    private static final String MY_TASK = "my.namespace.action.MY_TASK";
    private static final String MY_PARAM = "myParam";
    public MyService() {
        super("MyService");
    }
    @Override
    protected void onHandleIntent(Intent intent) {
        if (intent != null) {
            final String action = intent.getAction();
            String myParam = intent.getStringExtra(MY_PARAM);
            if (MY_TASK.equals(action)) {
                //my task hard work
                if (Config.DEBUG) Log.d(Config.TAG, "my task hard work with my param: " + myParam );
            }
        }
    }
    public static void runMyService(Context context, String parameter) {
        if (Config.DEBUG) Log.d(Config.TAG, "runMyService()");
        Intent intent = new Intent(context, MyService.class);
        intent.setAction(MY_TASK);
        intent.putExtra(MY_PARAM, parameter);
        context.startService(intent);
    }
}
Metodou runMyService spustíme službu, která vynutí zavolání metody onHandleIntent kde se podle proměnné action rozhodne jaká z úloh se bude provádět (v budoucnu se předpokládá více činnosti pro službu).
Zavolání služby je pak jednoduché:
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (Config.DEBUG) Log.d(Config.TAG, "onCreate()");
        MyService.runMyService(getContext(), "muj parametr");
    }