サンプルとして、起動後にカウントダウンを実行し、ゼロになったら終了するサービスと、
そのサービスを起動するアクティビティを例に解説します。
アクティビティの作成 
サービスを起動するアクティビティを作成します。
ボタンを一つだけ配置したServiceStartActivityを用意します。
ServiceStartActivity.java …サービスを起動するアクティビティクラス。
service_start.xml …レイアウトファイル
Intentによるサービスの起動 
ServiceStartActivityでは、ボタンのクリック時にサービスの起動処理を行っています。
Intent intent = new Intent(ServiceStartActivity.this, CountDownService.class); startService(intent);
Intentによるサービスの起動はアクティビティの起動によく似ていますが、
Activity起動の時とは違い、コンストラクタには送信元のContextと、起動するServiceのクラスを指定します。
Intentを生成したらContextのstartService()メソッドを利用して、起動を実行します。
サービスの作成 
処理を実行するサービスを作成します。
サンプルでは、以下のクラスから構成されるサービスを作成します。
(以降のサンプルソースのパッケージは"org.sample.service"となっています。)
CountDownService.java …サービス本体。起動時、終了時のメッセージ表示とCountDownThreadの実行。
CountDownThread.java …カウントダウンの実行スレッド。
ShowCountToastThread.java …カウント表示スレッド。
サービスはServiceクラスを継承し、onStart()メソッドにサービスが実行する処理を実装します。
public class CountDownService extends Service {
@Override public IBinder onBind(Intent intent) { return null; }
@Override public void onStart(Intent intent, int startId) { Toast.makeText(this, "Service has been started.", Toast.LENGTH_SHORT).show(); CountDownThread thread = new CountDownThread(this); thread.start(); }
@Override public void onDestroy() { Toast.makeText(this, "Service has been terminated.", Toast.LENGTH_SHORT).show(); } }
Serviceクラスを継承すると、onBind()を実装する必要があります。
クライアントからのサービスのバインドに応答しない場合は、nullを返すようにします。
カウントダウンの処理を実際に行うのはCountDownThreadクラスです。
CountDownThreadのコンストラクタにはオーナーであるServiceのContextを指定するようにします。
public CountDownThread(Context context) { mContext = context; mHandler = new Handler(); }
また、コンストラクタではメッセージ表示の為にHandlerインスタンスを生成し、
run()メソッドにおいて、カウントを表示する要求をHandlerにpost→1秒待機を10回繰り返す処理を行っています。
@Override public void run() { try { for (int count = MAX_COUNT; count >= 0; count--) { mHandler.post(new ShowCountToastThread(mContext, count)); Thread.sleep(1000); } } catch (InterruptedException e) { e.printStackTrace(); } … }
Threadで行われる処理の中で、画面更新などのUIスレッドに関わる処理をそのまま実行しようとすると、
エラーが発生します。
これはAndroidがシングルスレッドモデルを採用している為で、AsynTaskの場合と同様に、
Handlerに画面更新のタイミングを委ねる必要があります。
IntentによるServiceの停止 
CountDownThreadでは、処理が完了するとオーナーであるServiceの停止を実行します。
Intentを利用したServiceの停止はサービス起動時と同様にContextのstopService()メソッドを利用します。
Intent intent = new Intent(mContext, CountDownService.class); mContext.stopService(intent);
AndroidManifest.xmlへの登録 
作成したサービスをアプリケーションで実行する場合には、
"service"タグを使用してマニフェストファイルに登録します。
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="org.sample.service" android:versionCode="1" android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".ServiceStartActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
<!-- Serviceは "service"タグを利用してマニフェストファイルに登録する --> <service android:name=".CountDownService" />
</application>
<uses-sdk android:minSdkVersion="3" /> </manifest>