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を使用するにはどうすればよいですか?
多くのありがとうございます。
ありがとうございます。私のシナリオでは、ビットマップは〜900バイトで、これはおそらく公正なサイズであり、サービスのAPKにすべてのものを含めることを避けたい(多くの異なるクライアントが存在する可能性があります)。一意のIDを使用した場合、クライアントとサービスの両方のパッケージに実際のPNG ...が含まれているようですね。 – rippeltippel
すべての画像は '/ res/drawable'ディレクトリに含まれていなければなりません –