サービスを作成する (3/5)
作成:2010-11-01 21:58
更新:2010-11-01 21:58
更新:2010-11-01 21:58
■サービス側プログラムの作成
では、サービス側から作成しましょう。今回は、jp.tuyano.sampleパッケージに「MySampleService.java」というソースコードファイルを作成し、下に掲載したような形でソースコードを記述します。
○Serviceのメソッドをオーバーライドする
サービスのプログラムというのは、実は意外にシンプルです。Serviceクラスを継承してやるだけで、サービスを起動する際の特別な処理などは特にありません。ごく普通に、コンストラクタやonCreateメソッドをオーバーライドするなどして処理を記述してやればいいだけです。――ただし、Serviceを継承するため、以下のようなメソッドを予め用意する必要があります
アプリとサービスをバインド(関連付け)するための「Binder」によってサービスが他のアプリにバインドされたときに実行される処理。
見ればわかるように、これらはすべて「バインド」に関するものです。サービスは、単独で実行され処理を行ないますが、ただそれだけでは役に立ちません。他のアプリとバインドし、実行結果などをアプリに提供して、初めて役立つわけです。これらは、そのためのバインド処理に関するイベント処理メソッドなのです。
○Binderクラスの用意
このService継承クラスの他に、もう1つ「MySampleBinder」という内部クラスが定義されていることが分かります。これは、「Binder」クラスを継承したもので、他のアプリとのバインドを管理するためのものなのです。このBinderクラスでは、「getService」というメソッドだけが定義されています。これは、バインドされるサービスを返すためのものです。見ればわかるように、MySampleServiceクラスのthisが(つまり実行中のMySampleServiceインスタンスが)返されるようになっています。これにより、バインドしたサービスをBinderから知ることができるようになります。
○サービス利用の流れ
では、サービスからアプリへ処理の結果を送り返す処理の流れを整理しながら説明をしましょう。これはonStartメソッドで行っていますね。まずTimerを用意して、これを1000ミリ秒間隔でrunを実行するように設定してあります。これで、Timerにより1秒ごとにrunが実行される仕組みができあがります。
サービスからアプリに実行結果を返す処理は、このrunメソッド内で行っています。整理すると以下のようになるでしょう。
1.まず、必要な処理を実行するように処理を用意しておきます。
2.実行を終わり、結果をアプリ側に返す必要が生じたら、まずIntentインスタンスを用意します。これは、new Intent(ACTION)というように、引数にあらかじめ用意しておいた定数の値を渡しています。これは、ブロードキャストされるアクションを指定するための処理です。
3.Intentに、相手に送る値などを組み込んでおきます。ここでは「putExtra」というIntentのメソッドを使っていますね。Intentに用意されているこのメソッドを呼び出すことで、Intent内に、特定の名前で値を保管しておくことができます。
4.「sendBroadcast」メソッドを使い、Intentをブロードキャストします。これでおしまいです。後は、レシーバーでブロードキャストされたアクションを受信したアプリで必要な処理が実行される……はずです。
サービスでの必要な処理はこれだけです。意外と拍子抜けするほど簡単ですね。Binderクラスとバインドの仕組みがちょっとややこしそうですが、それさえ飲み込めればそう難しいものではありません。
○Serviceのメソッドをオーバーライドする
サービスのプログラムというのは、実は意外にシンプルです。Serviceクラスを継承してやるだけで、サービスを起動する際の特別な処理などは特にありません。ごく普通に、コンストラクタやonCreateメソッドをオーバーライドするなどして処理を記述してやればいいだけです。――ただし、Serviceを継承するため、以下のようなメソッドを予め用意する必要があります
public IBinder onBind(Intent intent)
アプリとサービスをバインド(関連付け)するための「Binder」によってサービスが他のアプリにバインドされたときに実行される処理。
public void onRebind(Intent intent)再度バインドし直したときに実行される処理。
public boolean onUnbind(Intent intent)バインドが解除されたときに実行される処理。
見ればわかるように、これらはすべて「バインド」に関するものです。サービスは、単独で実行され処理を行ないますが、ただそれだけでは役に立ちません。他のアプリとバインドし、実行結果などをアプリに提供して、初めて役立つわけです。これらは、そのためのバインド処理に関するイベント処理メソッドなのです。
○Binderクラスの用意
このService継承クラスの他に、もう1つ「MySampleBinder」という内部クラスが定義されていることが分かります。これは、「Binder」クラスを継承したもので、他のアプリとのバインドを管理するためのものなのです。このBinderクラスでは、「getService」というメソッドだけが定義されています。これは、バインドされるサービスを返すためのものです。見ればわかるように、MySampleServiceクラスのthisが(つまり実行中のMySampleServiceインスタンスが)返されるようになっています。これにより、バインドしたサービスをBinderから知ることができるようになります。
○サービス利用の流れ
では、サービスからアプリへ処理の結果を送り返す処理の流れを整理しながら説明をしましょう。これはonStartメソッドで行っていますね。まずTimerを用意して、これを1000ミリ秒間隔でrunを実行するように設定してあります。これで、Timerにより1秒ごとにrunが実行される仕組みができあがります。
サービスからアプリに実行結果を返す処理は、このrunメソッド内で行っています。整理すると以下のようになるでしょう。
1.まず、必要な処理を実行するように処理を用意しておきます。
2.実行を終わり、結果をアプリ側に返す必要が生じたら、まずIntentインスタンスを用意します。これは、new Intent(ACTION)というように、引数にあらかじめ用意しておいた定数の値を渡しています。これは、ブロードキャストされるアクションを指定するための処理です。
3.Intentに、相手に送る値などを組み込んでおきます。ここでは「putExtra」というIntentのメソッドを使っていますね。Intentに用意されているこのメソッドを呼び出すことで、Intent内に、特定の名前で値を保管しておくことができます。
4.「sendBroadcast」メソッドを使い、Intentをブロードキャストします。これでおしまいです。後は、レシーバーでブロードキャストされたアクションを受信したアプリで必要な処理が実行される……はずです。
サービスでの必要な処理はこれだけです。意外と拍子抜けするほど簡単ですね。Binderクラスとバインドの仕組みがちょっとややこしそうですが、それさえ飲み込めればそう難しいものではありません。
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。
●プログラム・リスト●
package jp.tuyano.sample; import java.util.*; import android.app.Service; import android.content.*; import android.os.*; public class MySampleService extends Service { public static final String ACTION = "MySampleService"; private Timer timer; private int counter; @Override public void onCreate() { super.onCreate(); } @Override public void onStart(Intent intent, int startId) { super.onStart(intent, startId); timer = new Timer(); timer.schedule(new TimerTask(){ @Override public void run() { counter++; Intent intent = new Intent(ACTION); intent.putExtra("counter", counter); sendBroadcast(intent); } }, 1000, 1000); } @Override public IBinder onBind(Intent intent) { return new MySampleBinder(); } @Override public void onRebind(Intent intent) { } @Override public boolean onUnbind(Intent intent) { return true; } // Binder内部クラス class MySampleBinder extends Binder { MySampleService getService() { return MySampleService.this; } } }
※関連コンテンツ