第 4 章 インテント 55
4.6 サービス
4.6.1 サービスの基礎
この節では、「サービス」(service)と呼ばれるオブジェクトについて説明したいと思います。
第1.6節で説明したように、サービスは、Androidアプリケーションを構築するための4種類 のコンポーネントのひとつです。
サービスは、アクティビティーと同じように、動作の主体となるオブジェクトですが、アクティ ビティーとは違って、画面を表示する機能がありません。ですから、サービスは、バックグラウ ンドで(画面の背後で)実行されることになります。
サービスは、
4.6. サービス 71 android.app.Service
という抽象クラスのサブクラスから作られるオブジェクトです。
4.6.2 サービスの起動
サービスを起動するメソッドとしては、
• ComponentName startService(Intent service)
• boolean bindService(Intent service, ServiceConnection conn, int flags) という二つのものがあります。
startServiceを使ってサービスを起動する方法は、アクティビティーを起動する方法とほと
んど同じです。たとえば、サービスのクラス名がMyServiceだとするならば、
Intent i = new Intent(this, MyService.class);
startService(i);
と書くことによって、そのクラスのサービスを起動することができます。
bindServiceは、「バインド」(bind)と呼ばれる方法でサービスを起動する場合に使われるメ
ソッドです。
4.6.3 サービスが起動されたときに呼び出されるメソッド
Serviceクラスで実装されている、
int onStartCommand(Intent intent, int flags, int startId)
というメソッドは、startServiceでサービスが起動されたときに呼び出されます。ですから、
このメソッドをサブクラスでオーバーライドすることによって、サービスが起動されたときに実 行したい動作を記述することができます。
onStartが受け取る1個目の引数は、サービスを起動したインテントです。
4.6.4 バインドによってサービスが起動されたときに呼び出されるメソッド
Serviceクラスには、
IBinder onBind(Intent intent)
という抽象メソッドがあります。これを実装したメソッドは、バインドによってサービスが起動 されたときに呼び出されることになります。
startServiceを使ってサービスを起動する場合、onBindは不要なメソッドですので、null を返すだけの動作を実装します。
4.6.5 サービスについての記述
サービスを持つアプリケーションを作る場合には、Androidマニフェストのapplication要 素の子供として、そのサービスについての記述を書き加える必要があります。
サービスについての記述は、
<service android:name=".クラス名" />
という要素です。「クラス名」のところには、Serviceクラスのサブクラスの名前を書きます。
4.6.6 サービスを起動するアプリケーションの例
それでは、サービスを起動するアプリケーションを作ってみましょう。
まず最初に、次のようなプロジェクトを作成してください。
Project name service Application name サービス
Package name org.example.service Create Activity ServiceActivity
次に、main.xmlを次のように書き換えてください。
レイアウトXMLの例 main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
<EditText android:id="@+id/edittext">
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
<Button android:id="@+id/start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="サービスの起動"
/>
</LinearLayout>
次に、Serviceをスーパークラスとする、MessageServiceという名前の新しいクラスを作っ て、MessageService.javaの内容を次のように書き換えてください。
プログラムの例 MessageService.java package org.example.service;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.widget.Toast;
public class MessageService extends Service implements Runnable {
private Toast toast;
Thread thread = null;
@Override
public IBinder onBind(Intent intent) { return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startID) { Toast.makeText(this, "Service Start",
Toast.LENGTH_SHORT).show();
toast = Toast.makeText(this,
intent.getExtras().getString("org.example.service.s"), Toast.LENGTH_SHORT);
thread = new Thread(this);
thread.start();
return super.onStartCommand(intent, flags, startID);
}
@Override
public void run() { try {
while (true) {
Thread.sleep(5000);
toast.show();
}
} catch (InterruptedException e) { } }
}
次に、ServiceActivity.javaを次のように書き換えてください。
プログラムの例 ServiceActivity.java package org.example.service;
4.7. ブロードキャスト 73