Voglio passare una stringa e una bitmap a un servizio utilizzando AIDL. Il servizio implementa questo metodo AIDL:Inserire una bitmap in un pacchetto
void addButton(in Bundle data);
Nel mio caso, il pacchetto contiene una stringa e una bitmap.
L'applicazione chiamante (client) ha questo codice:
...
// 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();
}
...
Sul lato di servizio, ho una classe ButtonComponent con questo codice:
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;
}
}
Dopo aver creato un ButtonComponent, il servizio crea un pulsante che utilizza il testo e l'icona dall'oggetto 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);
}
...
Come un risultato, il pulsante viene visualizzato con il testo corretto e posso vedere lo spazio per l'icona, ma la bitmap effettiva non viene disegnata (ad es. c'è uno spazio vuoto sul lato sinistro del testo).
È corretto inserire una bitmap in un pacchetto in questo modo?
Se dovessi usare un pacchetto (rispetto a un pacchetto) esiste un modo per mantenere un singolo argomento "dati" nel metodo AIDL per mantenere insieme testo e icona?
Domanda laterale: Come si decide di utilizzare Bundles vs Parcels?
Molte grazie.
Grazie. Nel mio scenario le bitmap sono ~ 900 byte, che è probabilmente una dimensione giusta, e voglio evitare di includerle tutte nell'APK del servizio (potrebbero esserci molti client diversi). Se ho usato un ID univoco, suppongo che entrambi i pacchetti dei clienti e del servizio conterranno il PNG reale ... giusto? – rippeltippel
tutte le immagini devono essere contenute nella directory '/ res/drawable' –