Я хочу передать строку и растровое изображение в службу с помощью AIDL. Служба реализует этот метод AIDL:
void addButton(in Bundle data);
В моем случае Bundle содержит строку и растровое изображение.
Вызывающее приложение (клиент) имеет этот код:
...
// 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 Сервис создает кнопку, используя текст и значок из объекта 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);
}
...
В результате кнопка отображается с правильным текстом, и я вижу пространство для значка, но фактическое растровое изображение не отображается (т. Е. В левой части текста есть пустое место).
Правильно ли поместить Bitmap в Bundle таким образом?
Если я должен использовать Parcel (против Bundle), есть ли способ сохранить один аргумент 'data' в методе AIDL, чтобы сохранить текст и значок вместе?
Дополнительный вопрос: как мне решить использовать Bundles vs Parcels?
Большое спасибо.