最近在做系统的Settings定制,其中Apps管理进入详情页面时,需要向详情界面传递两个参数,app包名和icon,这就遇到了一个问题,activity之间如何传递drawable?
第一种思路,将drawable图片转化成bitmap类型,使用bundle或Intent的extral域直接传递bitmap,这样做,在进入某些app的时候,程序居然直接崩了,网上百度过后,原来是因为不能直接传递大于40k的图片。
第二种思路,就是把drawable转化为bitmap,再将bitmap存储为byte数组,然后再通过Intent传递。下面是代码:
private Bitmap bitmap;
//drawable转化成bitmap的方法
private void drawableToBitamp(Drawable drawable) {
int w = drawable.getIntrinsicWidth();
int h = drawable.getIntrinsicHeight();
System.out.println("Drawable转Bitmap");
Bitmap.Config config =
drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888
: Bitmap.Config.RGB_565;
bitmap = Bitmap.createBitmap(w,h,config);
//注意,下面三行代码要用到,否在在View或者surfaceview里的canvas.drawBitmap会看不到图
Canvas canvas = new Canvas(bitmap);
drawable.setBounds(0, 0, w, h);
drawable.draw(canvas);
}
bitmap转化成byte数组:
private byte[] bitmap2Bytes(Bitmap bm){
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bm.compress(Bitmap.CompressFormat.PNG, 100, baos);
return baos.toByteArray();
}
使用Intent传递数据:
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Intent intent=new Intent(AppsActivity.this,AppDetailActivity.class);
String pkgName = mlistAppInfo.get(position).getAppLabel();
Drawable appIcon = mlistAppInfo.get(position).getAppIcon();
String pkgName1 = mlistAppInfo.get(position).getPkgName();
drawableToBitamp(appIcon);
byte[] bytes = bitmap2Bytes(bitmap);
intent.putExtra("appIcon", bytes);
intent.putExtra("packageName",pkgName);
intent.putExtra("packageName1",pkgName1);
startActivity(intent);
}
});
另一个Activity接收图片:
byte[] appIcons = intent.getByteArrayExtra("appIcon");
Bitmap bitmap= BitmapFactory.decodeByteArray(appIcons,0,appIcons.length);
appIcon.setImageBitmap(bitmap);