Boring Days as tech

金に生きるは下品にすぎる、 恋に生きるは切なすぎ、 出世に生きるはくたびれる。 とかくこの世は一天地六。 命ぎりぎり勝負をかける。 仕事はよろず引き受けましょう。 大小遠近男女は問わず、委細面談、仕事屋稼業。

IntentService

先日のGoogleDeveloperDays2010JapanでAndroidの高速化の際に出てきてたクラス。
気になってググったらやっぱり日本語の説明があんまりないのでメモ的に簡単に説明。

ServiceをオーバーライドしたIntentService

任意の特定の処理をメインスレッドとは別のスレッドで非同期で行うためのクラス。
このサービスは通常メインスレッドでハンドリングしないような処理を行うためのものらしい
呼び出し方はサービス的だけれども同一プロセス内で別スレッドを立ち上げて処理する。
実際に実装するには、IntentServieを拡張しonHandleIntent内に特定の処理を記述する。

IntentService拡張

サービスとしてのクラスなのでインナークラスでの記述は不可能

public class CustomIntentService extends IntentService{
	private static final String name="TEST";

	public CustomIntentService() {
		super(name);
	}
	@Override
	protected void onHandleIntent(Intent intent) {
		//ここに時間のかかる重い処理を記述
	}
}
Activity側での呼び出し
    @Override
    public void onResume(){
    	super.onResume();
    	Intent intent = new Intent(Intent.ACTION_SYNC,null,this,CustomIntentService.class);
    	this.startService(intent); //ここからスタート!
    }
ちゃんとAndroidManifest.xmlにも記述
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        ・
        ・
        ・
    <service android:name="CustomIntentService"></service> //先ほどの拡張クラスを明記!
    </application>

そんなIntentServiceの中身

中身はHandlerThreadを1つ作ってそのループにキューを投げるというだけっぽいので、
たとえば同時に複数回startServiceメソッドを呼び出したとしてもここで要求される全てのリクエストは、
サービスを開始した順に同一プロセス内でシングルスレットで一つずつ処理される。
すべてのキューが終了したら通常のスレッドと同じように破棄される、という流れなのかな。
とはいえ、AsyncTaskと違うのはIntentServiceはService自身をスタートさせたActivityに依存せずに処理が続く。
AsyncTaskのように元Activityの生き死にで処理の中断などはされない。