aidlで色々な値を送る

Androidのサービス感通信はaidlを使ってできる。使い方とかについては前に書いた

んで、今度は、aidlで色々な値を送ってみた。

参考URL

詳しく知りたい人は、以下のURLの方が詳しく書いてある。

送れる値

aidlで送ることができる値は、以下の種類がある

  • Java 言語のプリミティブ型 ( int、boolean、その他 ) — import 文は不要です。
  • 以下のクラスのどれかひとつ ( import 文は不要 ) 。
    • String
    • List – リストの要素すべては、他の AIDL で生成されたインターフェイスと Parcelable を含む、このリストのタイプのどれかである必要があります。オプションで “総称型” クラスとして使用されることもあります ( 例、List ) 。メソッドは List インターフェイスを使って生成されますが、もう一方の受信する側の実際の具象クラスでは常に ArrayList になります。
    • Map – マップの要素すべては、他の AIDL で生成されたインターフェイスと Parcelable を含む、このリストのタイプのどれかである必要があります。総称型のマップ ( 例、Map の形式 ) はサポートされていません。メソッドは Map インターフェイスを使用して生成されますが、もう一方の受信する側の実際の具象クラスでは常に HashMap 型となります。
    • CharSequence – これは TextView と他のウィジェットオブジェクトにより使用される CharSequence タイプ用に便利です。

in, out, inout

Javaのプリミティブ型についてはinとかoutとか付けなくても問題ないみたいだけど、MapとかListとか使おうとした場合はこれを書かないとエラーになる。以下@itからの転記。

interface ICalculatorService { // 【3】
    oneway void registerCallback(ICalculatorCallback callback); // 【4】
    oneway void unregisterCallback(ICalculatorCallback callback);
    int add(int lhs, int rhs);
    void sum(in List values); // 【5】
    void rotate(inout int[] array, int num);
    int eval(in CalculatorExpression exp);
}

独自クラスを作った場合

独自クラスの受け渡しはPerticalを使って行う。ここは試してないから割愛。僕はたまたまHashMapを渡す必要があったからそこに独自クラスを載せて送ることはできた。Perticalを使用する例は@itに書いてあるからそちらを参照下さい。

aidl

package com.choilabo.dpbxplayer.aidl;
interface IServiceConnection {
	void setMap(in Map objMap);
}

service

	@Override
	public void setMap(Map objMap) throws RemoteException {
		// Map型はHashMapになるらしいのでキャスト
		HashMap<Integer, HogeClass> items = (HashMap<Integer, HogeClass>) objMap;

		// 以下itemsを使って好きな様に処理をする
	}

まとめ

in、out、inoutをつけないとエラーが出てaidlがコンパイルできなかくて小一時間ハマった。Serviceに対して独自Classを送るサンプルっていうのが非常に少なかったんだけど一般的にやらないのかなぁ。結構使うときは多いと思うんだけどどうなんだろう。