• 検索結果がありません。

第 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