繰り返し処理を行うとき
「単純なサービス」 では長時間かかる処理は別スレッドで実行する必要があると言いました。
ここでは、繰り返し処理を行う状況で Timer を利用する方法を紹介します。
頻度の高い繰り返し処理は Timer が便利
startService を呼んでサービスを開始するとき、サービス側では onCreate、onStartCommand が順に呼ばれます。
onCreate は初期化を行い、onStartCommand で実際の処理を開始します。
ここで長時間かかる処理を直接実行すると、サービスを開始した側がブロックします。呼出側がアクティビティなら GUI がフリーズしてしまいます。 したがって実際の処理は非同期で行うべきです。
非同期でタスクを実行する方法はたくさんありますので、いくつか当サイト内で紹介しますが、今回は繰り返し処理がポイントです。
比較的短い間隔での繰り返し処理を行う場合は Timer を利用するとよいです。具体例は次の通りです。
package com.keicode.android.test;
import java.util.Timer;
import java.util.TimerTask;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;
public class MyService extends Service {
final static String TAG = "MyService";
final int INTERVAL_PERIOD = 5000;
Timer timer = new Timer();
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG, "onCreate");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d(TAG, "onStartCommand");
timer.scheduleAtFixedRate(new TimerTask(){
@Override
public void run() {
Log.d(TAG, "Hello!");
}
}, 0, INTERVAL_PERIOD);
return START_STICKY;
}
@Override
public void onDestroy() {
super.onDestroy();
if(timer != null){
timer.cancel();
}
Log.d(TAG, "onDestroy");
}
}
5秒間隔で TimerTask の内容を繰り返し行っています。ここではログを記録するだけですが。
stopService で処理を止めるときに、タイマーをキャンセルします。