背景
工作中碰到一个需求,需要跨进程传输图片,项目中使用了android的SharedMemory,这里简单介绍下它的使用。
添加此功能的API
API level 27
类接口
参见官方文档
https://developer.android.google.cn/reference/android/os/SharedMemory?hl=en
跨进程使用(这里以传图片字节为例)
一、服务端创建并存入数据:
FileInputStream inputStream = new FileInputStream(jpegFile);
byte[] bytes = new byte[(int) jpegFile.length()];
inputStream.read(bytes);
SharedMemory sharedMemory = SharedMemory.create("test", bytes.length);
ByteBuffer buffer = sharedMemory.mapReadWrite();
buffer.put(bytes);
sharedMemory.setProtect(OsConstants.PROT_READ);
SharedMemory.unmap(buffer);
return sharedMemory;
二、客户端获取数据显示
SharedMemory sharedMemory = iService.takeScreenshot();
if (sharedMemory == null) {
return;
}
ByteBuffer byteBuffer = sharedMemory.mapReadOnly();
int len = byteBuffer.limit() - byteBuffer.position();
byte[] bytes = new byte[len];
byteBuffer.get(bytes);
Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
imageView.setVisibility(View.VISIBLE);
imageView.setImageBitmap(bitmap);
SharedMemory.unmap(byteBuffer);
sharedMemory.close();
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
注意事项
1、服务端service销毁时,记得sharedMemory.close
2、服务端传输sharedMemory时,记得setProtect(OsConstants.PROT_READ)
3、客户端使用完sharedMemory,最好unmap下,避免内存占用