2011-10-11 3 views
5

AIDLを使用して文字列とビットマップをサービスに渡したいとします。サービスは、このAIDLメソッド実装しています。私の場合はビットマップをバンドルに入れる

void addButton(in Bundle data); 

を、バンドルには、文字列やビットマップが含まれています。

呼び出しアプリケーション(クライアント)は、このコードを持っています

... 
// Add text to the bundle 
Bundle data = new Bundle(); 
String text = "Some text"; 
data.putString("BundleText", text); 

// Add bitmap to the bundle 
Bitmap icon = BitmapFactory.decodeResource(getResources(), R.drawable.myIcon); 
data.putParcelable("BundleIcon", icon); 

try { 
    myService.addButton(data); 

} catch (RemoteException e) { 
    Log.e(TAG, "Exception: ", e); 
    e.printStackTrace(); 
} 
... 

サービス側では、私はこのコードでButtonComponentクラスを持っている:

public final class ButtonComponent implements Parcelable { 
    private final Bundle mData; 

    private ComponComponent(Parcel source) { 
     mData = source.readBundle(); 
    } 

    public String getText() { 
     return mData.getString("BundleText"); 
    } 

    public Bitmap getIcon() { 
     Bitmap icon = (Bitmap) mData.getParcelable("BundleIcon"); 
     return icon; 
    } 

    public void writeToParcel(Parcel aOutParcel, int aFlags) { 
     aOutParcel.writeBundle(mData); 
    } 

    public int describeContents() { 
     return 0; 
    } 
} 

ButtonComponentを作成した後、サービスが作成されます

... 
mInflater.inflate(R.layout.my_button, aParent, true); 
Button button = (Button) aParent.getChildAt(aParent.getChildCount() - 1); 

// Set caption and icon 
String caption = buttonComponent.getText(); 
if (caption != null) { 
    button.setText(caption); 
} 

Bitmap icon = buttonComponent.getIcon(); 
if (icon != null) { 
    BitmapDrawable iconDrawable = new BitmapDrawable(icon); 
    button.setCompoundDrawablesWithIntrinsicBounds(iconDrawable, null, null, null); 
} 
... 

として:ButtonComponentオブジェクトからテキストやアイコンを使用して、ボタンその結果、ボタンは正しいテキストで表示され、アイコンのスペースがわかりますが、実際のビットマップは描画されません(つまり、テキストの左側に空白があります)。

この方法でビットマップをバンドルに入れるのは正しいですか?

Parcel(vs a Bundle)を使用する必要がある場合は、AIDLメソッドで単一の 'data'引数を維持してテキストとアイコンを一緒に保つ方法がありますか?

サイド質問:Bundles vs Parcelsを使用するにはどうすればよいですか?

多くのありがとうございます。

答えて

2

解決済み。

問題は、私が使用していたPNGがAndroidでサポートされていないことでした。 コード:

icon.getConfig() 

を返します。

3

ここに2番目の質問に対する回答があります。

出典:http://www.anddev.org/general-f3/bundle-vs-parcel-vs-message-t517.html

バンドルは、標準的な地図と機能的に同等です。 の理由は、Bundleが使用されているコンテキストでは というのは、 という文字列、intsなどのプリミティブだけです。標準のMap APIで 任意のオブジェクトを挿入できるため、開発者は マップにデータを格納することができます。マップ の代わりに のみがプリミティブをサポートしていることを明示的に明らかにする型保証されたコンテナで置き換えるバンドルが作成されました。

ParcelはBundleと似ていますが、より洗練されており、 はより複雑なクラスの直列化をサポートできます。アプリケーションは、特にサービスを使用しているときに、アプリケーション固有の クラスを渡すことができるParcelableインターフェイスを実装するために、 クラスを実装できます。 パーセルはBundlesより洗練されていますが、これは でかなり高いオーバーヘッドがかかります。

バンドルとパーセルの両方がデータのシリアル化メカニズムであり、 の場合、アプリケーションコードが プロセスに渡ってデータを渡しているときに、両方とも使用されます。ただし、Parcelは非常に高いオーバーヘッドであるため、 バンドルは、onCreate メソッドのようなより一般的な場所でバンドルが使用されます。オーバーヘッドはできるだけ低くする必要があります。小包は、 のほとんどが、アプリケーションがアプリケーションの意味のあるクラスをメソッド引数 および戻り値として使用できる論理 APIを持つサービスを定義できるようにするためによく使用されます。そこにBundleが必要だった場合は、 という本当にclunkyなAPIになります。プリミティブはカスタムのパーセル可能なクラスよりも効率的に をよりシリアライズするので、一般的にサービスAPIは を可能な限りシンプルに保つ必要があります。

1

gt_ebuddyは素敵な答えを与える一方で、私はちょうどあなたの質問にはほとんどサイドノートを持っている:

問題:あなたはメモリにBitmapオブジェクトを渡すしようとしている、それは問題ないことができます。しかし、このような多くのオブジェクトを多く渡すことは絶対に良くありません。本当に悪い習慣。

解決方法:画像はすでにresourcesに存在し、それはユニークなIDです。それを使い果たしてしまう。 Bitmapsを大量に渡そうとするのではなく、BundleまたはParcelを使用してIDを渡すことができますが、単純なデータ構造の場合はBundleが望ましいです。

+0

ありがとうございます。私のシナリオでは、ビットマップは〜900バイトで、これはおそらく公正なサイズであり、サービスのAPKにすべてのものを含めることを避けたい(多くの異なるクライアントが存在する可能性があります)。一意のIDを使用した場合、クライアントとサービスの両方のパッケージに実際のPNG ...が含まれているようですね。 – rippeltippel

+0

すべての画像は '/ res/drawable'ディレクトリに含まれていなければなりません –

関連する問題