2011-10-11 2 views
5

AIDL을 사용하여 문자열과 비트 맵을 서비스에 전달하려고합니다. 이 서비스는 다음 AIDL 메소드를 구현합니다.비트 맵을 번들로 묶기

void addButton(in Bundle data); 

필자의 경우 Bundle에는 String과 Bitmap이 있습니다. 이 코드와 ButtonComponent 클래스가 서비스 종료에

... 
// 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(); 
} 
... 

:

호출 응용 프로그램 (클라이언트)이 코드가

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); 
} 
... 

As 결과는 버튼이 올바른 텍스트로 표시되고 아이콘 공간을 볼 수 있지만 실제 비트 맵은 그려지지 않습니다 (예 : 텍스트의 왼쪽에 빈 공간이 있음).

이 방법으로 비트 맵을 번들에 넣는 것이 맞습니까?

내가 Parcel (vs a Bundle)을 사용해야한다면 AIDL 메서드에서 단일 'data'인수를 유지하여 텍스트와 아이콘을 함께 유지할 수 있습니까?

사이드 질문 : 번들 대 소포를 어떻게 사용합니까?

감사합니다.

답변

2

해결되었습니다.

사용중인 PNG가 Android에서 지원되지 않는 문제가있었습니다. 코드 :

icon.getConfig() 

을 반환합니다.

3

다음은 두 번째 질문에 대한 답변입니다.

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

번들이 표준지도 기능적으로 동일합니다. 은 Bundle이 사용 된 컨텍스트에서 이 들어갈 수있는 유일한 것들이 문자열, ints 등과 같은 프리미티브이기 때문에 Map을 사용하지 않았습니다. 표준 Map API를 사용하면 임의의 객체를 삽입 할 수 있기 때문에 개발자가 시스템에서 실제로 지원할 수없는 지도에 데이터를 입력 할 수 있으므로 이상한 직관적 인 응용 프로그램 오류가 발생할 수 있습니다. 번들은지도 을 타입 안전 컨테이너로 대체하여 만 프리미티브를 지원함을 명시 적으로 명확하게 만듭니다.

소포는 번들과 유사하지만 더 복잡한 데 은 클래스의보다 복잡한 직렬화를 지원할 수 있습니다. 응용 프로그램은 응용 프로그램 관련 클래스를 전달할 수있는 Parcelable 인터페이스를 구현할 때 특히 서비스를 사용할 때 클래스를 구현할 수 있습니다. Parcelables는 Bundles보다 더 복잡 할 수 있지만, 이는 에 상당히 높은 오버 헤드가 소요됩니다.

번들과 소포는 모두 데이터 직렬화 메커니즘이며 의 경우 대부분 응용 프로그램 코드가 프로세스에서 데이터를 전달할 때 사용됩니다. 그러나 Parcel은 번들보다 훨씬 높은 오버 헤드이므로 번들은 onCreate 메서드와 같은보다 일반적인 장소에서 사용되며 오버 헤드는 가능한 한 낮아야합니다.소포는 대부분 이며 응용 프로그램에서 논리적 인 API를 사용하여 응용 프로그램에서 의미있는 클래스를 메서드 인수 및 반환 값으로 사용할 수 있도록 정의하는 데 일반적으로 사용됩니다. 거기에 Bundle이 필요하다면 은 정말로 clunky 한 API가 될 것입니다. 프리미티브는 사용자 정의 Parcelable 클래스보다 효율적으로 을 직렬화하기 때문에 일반적으로 서비스 API는 을 가능한 단순하게 유지해야합니다. gt_ebuddy이 좋은 답을 제공하는 동안

1

, 나는 당신의 질문에 약간의 보조 노트를 가지고 :

문제 : 당신은 괜찮을 수있는 메모리에 Bitmap 개체를 전달하려고하는; 그러나 이런 많은 객체를 넘겨주는 것은 좋지 않습니다. 정말 나쁜 습관.

내 솔루션 : 이미지는 이미 resources에 존재하며 고유 한 ID입니다. 그것에서 벗어나십시오. Bitmaps을 많이 전달하는 대신 Bundle 또는 Parcel을 사용하여 ID을 전달할 수 있지만 간단한 데이터 구조의 경우 Bundle이 바람직합니다.

+0

감사합니다. 내 시나리오에서는 비트 맵이 ~ 900 바이트인데, 이는 꽤 큰 크기이며 서비스의 APK에 모든 것을 포함시키지 않으려합니다 (많은 다른 클라이언트가있을 수 있음). 고유 한 ID를 사용하면 클라이언트와 서비스 패키지 모두 실제 PNG ...가 포함될 것입니다. 맞습니까? – rippeltippel

+0

모든 이미지는'/ res/drawable' 디렉토리에 있어야합니다. –