連載
» 2009年06月18日 00時00分 公開

Androidで動く携帯Javaアプリ作成入門(7):常駐アプリが作成できるAndroidの“サービス”とは (3/3)

[緒方聡,株式会社イーフロー]
前のページへ 1|2|3       

サービスからアンバインド、リバインド

 以下は、サービスからアンバインドして再度バインドするコードです。

    // いったんアンバインドしてから再度バインド
    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秒後にきちんとアラームが鳴ります。ただし、この実装の場合、一度動かしてしまったスレッドを後から止める手段はありません。

シーケンス図にすると、以下のような感じです。

図3 Activityのタスクが異なる 図3 Activityのタスクが異なる

これがサービスを使った場合なら、以下のようなシーケンス図になります。

図4 カーソルの概念図 図4 カーソルの概念図

サービスを使わなくてもできること(投げっぱなしの処理など)は、使わない方が簡単でよいのですが、使わなければ実現できない処理もあると思います。上記を参考に、どんな処理でサービスが必要なのか、よく検討してみてください。


サービスを使用するための設定

 サービスを使用するには、AndroidManifest.xmlに設定をしなければなりません。図5とAndroidManifest.xmlを参考に、設定してみてください。

図5 Application NodesにServiceを登録 図5 Application NodesにServiceを登録
<?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>

国際化してAndroid Marketから世界へ発信!

 今回はサービスを使用したアプリの作り方を紹介しました。今回のサンプルKitchenTimer.zipは、サービスを使用するアプリの骨組みになるような形になっているので、これに肉付けしてサービスを使用した面白いアプリを作ってみてください。

 さて次回は、国際化多言語化を取り上げます。国内でAndroidケータイが発売され、日本語もサポートされるとなると、つい日本語のアプリを作ってしまいたくなりますが、ちょっと待ってください。

 マーケットは国内より世界の方が何倍も大きいですし、開発者としても、せっかく作ったアプリをたくさんのユーザーに使ってもらいたいと思いますよね。そのためにも、公開するアプリは、何とか頑張って日本語と英語ぐらいはサポートしておきたいところです。次回もお楽しみに。


「Androidで動く携帯Javaアプリ作成入門」バックナンバー
前のページへ 1|2|3       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。