トップ «前の日記(2010-01-09) 最新 次の日記(2010-01-17)» 編集

Ussy Diary


2010-01-10

AIDL インターフェース引数に Parcelable 実装クラスを指定する

Android で画面操作を行っているときに電話がかかってくると、処理が停止されてしまいます。しかし停止させず処理を継続させたい場合にはサービスという概念が用意されており、これを利用することで処理をバックエンドで続けてくれるとのこと。

実装方法はいくつかあるのですが、今回は AIDL ファイルに Java インターフェースを定義して、コールバックを受け取れるバインダという種類を選択してみました。なお AIDL ファイルに記述したインターフェースは ADT によって、インターフェースを実装したクラスが自動的に生成されます。

まず AIDL ファイルに定義するインターフェースの引数、戻り値に指定できるものとして以下の制約があるとのことです。

  • プリミティブ型
  • String, List, Map, CharSequence, AIDL ファイルに定義したインターフェース
  • Parcelable インターフェースを実装したクラス

新しく Parcelable インターフェースというものが出てきたのですが、すごく適当にいうと Serializable の Android 用みたいなものです。 Java の Serializable は冗長なので、 Android ではリモート通信間に使うものには Parcelable インターフェースを実装するルールのようです。

で、今回 Parcelable インターフェースを実装した ValueObject を渡そうとしたところ意外にハマってしまったのでメモしておきます。

example.dto.Hoge クラスが Parcelable インタフェースを実装しているものとします。(インターフェース実装は省略します)

Hoge クラスと同じ example.dto パッケージに Hoge.aidl ファイルを作成します。

Hoge.aidl

package example.dto;

parcelable Hoge;

ここでは Hoge クラスが parcelable であることを宣言します。

続いてコールバックを受け取るリスナを example.service パッケージに定義します。

HogeCallbackListener.aidl

package example.service;

import example.dto.Hoge;

interface HogeCallbackListener {

    void receive(in Hoge hoge);
}

ここでは先ほど Hoge.aidl で定義した Hoge クラスを import し、インターフェースの引数に in を指定しました。なお public をつけるとおこられます。これで利用するための準備は整いました。

この後に AndroidManifest ファイルに Service を定義したり、 Activity や Service にコードを記述したりと面倒な作業が待っています。

参考

http://developer.android.com/intl/ja/guide/developing/tools/aidl.html

Tags: Android