以下は、サービスからアンバインドして再度バインドするコードです。
// いったんアンバインドしてから再度バインド
unbindService(serviceConnection);
bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);
バインドするときに使用したServiceConnectionをアンバインド時に指定します。サービスからアンバインドすると、Service#onUnbind(Intent)メソッドが呼び出されます。
アンバインド後に再度バインドすると、再びサービスに接続しますが、このときにService#onBind(Intent)メソッドが呼び出されるか、Service#onRebind(Intent)メソッドが呼び出されるかは、Service#onUnbind(Intent)メソッドで返すbooleanの値をtrueにするかfalseにするかで選択できます。
trueを返すとService#onRebind(Intent)メソッドが、falseを返すとService#onBind(Intent)メソッドが呼び出されます。今回は、Service#onRebind(Intent)メソッドが呼び出されるようにしています。
実はこれだけであれば、わざわざサービスを使用する必要はありません。ThreadクラスなりTimerクラスなりを使用して、指定時間後にアラームを鳴らせばよいだけです。
ここでサービスを使用するメリットは、いったん設定したアラームを取り消したり再設定したりすることが後から可能になる点です。以下のコードを例に説明します。
public class Dummy extends Activity {
Thread thread;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
thread = new Thread() {
@Override
public void run() {
try {
Thread.sleep(60000);
MediaPlayer ms = MediaPlayer.create(Dummy.this, R.raw.alarm);
ms.start();
} catch (InterruptedException e) {
}
}
};
thread.start();
}
}
このコードは、Activityが生成されたら、即座にスレッドを生成して60秒後にアラームを鳴らすサンプルです。このアプリを起動して、すぐに終了したとしても、スレッドは動き続け、60秒後にきちんとアラームが鳴ります。ただし、この実装の場合、一度動かしてしまったスレッドを後から止める手段はありません。
シーケンス図にすると、以下のような感じです。
これがサービスを使った場合なら、以下のようなシーケンス図になります。
サービスを使わなくてもできること(投げっぱなしの処理など)は、使わない方が簡単でよいのですが、使わなければ実現できない処理もあると思います。上記を参考に、どんな処理でサービスが必要なのか、よく検討してみてください。
サービスを使用するには、AndroidManifest.xmlに設定をしなければなりません。図5とAndroidManifest.xmlを参考に、設定してみてください。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.android.service">
<application android:icon="@drawable/icon">
<activity android:name=".Main" 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 android:enabled="true" android:name=".KitchenTimerService" />
</application>
</manifest>
今回はサービスを使用したアプリの作り方を紹介しました。今回のサンプルKitchenTimer.zipは、サービスを使用するアプリの骨組みになるような形になっているので、これに肉付けしてサービスを使用した面白いアプリを作ってみてください。
さて次回は、国際化・多言語化を取り上げます。国内でAndroidケータイが発売され、日本語もサポートされるとなると、つい日本語のアプリを作ってしまいたくなりますが、ちょっと待ってください。
マーケットは国内より世界の方が何倍も大きいですし、開発者としても、せっかく作ったアプリをたくさんのユーザーに使ってもらいたいと思いますよね。そのためにも、公開するアプリは、何とか頑張って日本語と英語ぐらいはサポートしておきたいところです。次回もお楽しみに。
Copyright © ITmedia, Inc. All Rights Reserved.