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