My Photo

« Androidアプリ開発メモ030:サービス その2 | Main | ココログとtwitterの連携機能を有効にした »

October 24, 2011

Androidアプリ開発メモ031:サービス その3:IntentService

サービスについての以前の記事:
Androidアプリ開発メモ021:サービス
Androidアプリ開発メモ030:サービス その2

IntentService
IntentServiceクラスはSerivceクラスのサブクラスで、非同期・バックグラウンドで実行する処理を実装するのに使えるクラス。
リファレンスには

IntentService is a base class for Services that handle asynchronous requests (expressed as Intents) on demand.
IntentServiceは、サービスのためのベースクラスである。オンデマンドで非同期要求(Intentで表現された)をハンドルする。
とある。
IntentService は以下のことをしてくれる。
  • アプリケーションのメインスレッドから分離したデフォルトのワーカスレッドを作成し、onStartCommand()に配信されるすべてのインテントを実行する。
  • onHandleIntent()の実装にひとつのインテントを渡すワークキューを作成することにより、マルチスレッドに関する心配はなくなる。
  • 開始要求のすべてをハンドルした後、サービスを停止することにより、stopSelf()を呼び出す必要はなくなる。
  • null を返すonBind()のデフォルト実装を提供する。
  • ワークキュー、その後onHandleIntent()の実装にインテントを送信するonStartCommand()のデフォルト実装を提供する。
Serviceクラスを継承してサービスを実装し別スレッドを作った場合、stopService()を呼ぶと別スレッドも終わってしまうが、IntentServiceを継承した場合は別スレッドは何事もなく続く。
参考サイト2に載っている「Serviceの起動停止のサンプル」はServiceを継承したもので、IntentServiceを利用したサービスのサンプルはIntentServiceを継承している。
前者はstopService()の呼び出しでWorkerThreadではInterruputedExceptionが発生してWorkerThreadも終了するが、後者ではstopService()が呼ばれても別スレッドは実行が継続される。
なぜ前者においてstopService()でWorkerThreadに例外が発生するのかがわからないが、動作としては上記のような違いが出る。
このような違いがあるので、サービスが止まったとしても別スレッドで処理が終了するまで実行しっ放しの実装にIntentServiceを使うことができる。

EclipseでIntentServiceを継承したクラスを作成するとクイックフィックスにString型の引数を取るコンストラクタが出てくるが、実際に必要なのは引数なしのコンストラクタなので注意が必要。
String型の引数を取るコンストラクタで実行した場合、サービスを開始しようとすると実行時エラーが出る。
onStartCommand(),onCreate(),onDestroy()などのコールバックメソッドをオーバーライドする場合は、必ずsuperの実装を呼び出すようにする必要がある。
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
  // 何か処理をする
  return super.onStartCommand(Intent intent, int flags, int startId);
}

ログを出すだけのサンプルコード。連続してstartService()を呼んでも1つずつ順番に実行される。
package com.example.intentserviceexample;

import android.app.IntentService;
import android.content.Intent;
import android.util.Log;

/**
 * IntentServiceを継承したクラス
 */
public class MyService extends IntentService {

  public MyService() {
    super("MyService");
  }

  @Override
  protected void onHandleIntent(Intent intent) {
    try {
      int thNo = intent.getIntExtra("th_no", -1);
      Log.v("IntentService", thNo + ":start thread");
      Thread.sleep(5000);
      Log.v("IntentService", thNo + ":end thread");
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

参考サイト:
1.2. サービス - ソフトウェア技術ドキュメントを勝手に翻訳
2.Android | ナレッジデザイン大竹のホームページ (by drupal)
3.IntentService - Boring Days in tech
4.IntentServiceを使って非同期処理を行う<< Tech Booster

« Androidアプリ開発メモ030:サービス その2 | Main | ココログとtwitterの連携機能を有効にした »

Androidアプリ開発」カテゴリの記事

Comments

Post a comment

(Not displayed with comment.)

TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/26461/53076539

Listed below are links to weblogs that reference Androidアプリ開発メモ031:サービス その3:IntentService:

« Androidアプリ開発メモ030:サービス その2 | Main | ココログとtwitterの連携機能を有効にした »

May 2017
Sun Mon Tue Wed Thu Fri Sat
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      
無料ブログはココログ

日本blog村

  • にほんブログ村 IT技術ブログへ
  • にほんブログ村 アニメブログへ
  • にほんブログ村 サッカーブログ アルビレックス新潟へ

好きな音楽家

メモ

XI-Prof