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