我想使用 AIDL 将字符串和位图传递给服务。Service 实现了这个 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 后,Service 使用 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 相比),有没有办法在 AIDL 方法中维护单个“数据”参数以将文本和图标保持在一起?
附带问题:我如何决定使用捆绑包和包裹?
非常感谢。