是否可以将Image
作为额外内容传递给活动?
对于Strings,它以这种方式工作:
intent = new Intent(this, 2Activity.class);
intent.putExtra("String", "xy");
startActivity(intent);
这样可以为图像做到这一点吗?或者图像的记忆是一个问题吗?
答案 0 :(得分:3)
通过intent传递的数据大小有限,所以它可能无效。执行此操作的常规方法是传递图像的文件名或resourceID。
答案 1 :(得分:1)
好问题。首先,没有Image
类,所以我不确定这是否来自您所包含的库。你是说Bitmap
吗?
答案一般不,你不能。该代码序列是一个进程间调用,它通过Android的binder内核驱动程序传递参数。参数的大小有1MiB的硬性限制。如果您保持图像较小,则可以考虑Bitmap
是图像的未压缩表示,因此即使您认为合理大小的图像在内存中也会相当大。还要考虑1MiB缓冲区是与进程之间的所有IPC共享的。如果您的应用程序的某些其他组件正在执行IPC,则会减少可用的缓冲区。
考虑传递可用于读取图像数据的ParcelFileDescriptor
,指向可以提供图像数据的内容提供商的content://
URI(请参阅openFile()
),或者file://
URI指向文件系统上的图像数据。
答案 2 :(得分:1)
当然可以。无论是作为String,还是创建某种包装器并实现parcelable ......这就是说Bitmap已经是Parcelable ..
然而,不要这样做!这实际上花了我一次面试。如this question points out,限制为1MB。您的图像可能通过哪个。您应该做的是将其保存为文件并传递URI。或者将文件存储在应用程序层。传递URI,这是干净的方式。
请参阅此SO for URI.
答案 3 :(得分:0)
正如其他人在此解释的那样,记忆将成为一个问题。要解决此问题,您可以将图像存储在散列映射中,并在片段和活动之间传递密钥。
您可以使用此包装类在内存中保存图像。
public class DataWrapper {
private static final DataWrapper instance = new DataWrapper();
private final SparseArray<Object> map = new SparseArray<Object>();
private int currentKeyValue = 1;
public static DataWrapper getInstance() {
return instance;
}
public int putData(final Object data) {
++currentKeyValue;
map.put(currentKeyValue, data);
return currentKeyValue;
}
public Object getData(final int key) {
final Object ret = map.get(key);
map.delete(key);
return ret;
}
}
你可以像这样把putData放到包装器中:
final byte[] imageData;
final int imageDataKey = DataWrapper.getInstance().putData(imageData);
data.putExtra(EXTRA_IMAGE, imageDataKey);
你可以从包装器中获取getData:
final int imageDataKey = data.getIntExtra(CameraFragment.EXTRA_IMAGE, 0);
final byte[] data = (byte[]) DataWrapper.getInstance().getData(imageDataKey));