欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

SharedMemory使用,跨进程传输byte数据

程序员文章站 2022-03-11 14:41:31
背景工作中碰到一个需求,需要跨进程传输图片,项目中使用了android的SharedMemory,这里简单介绍下它的使用。添加此功能的APIAPI level 27类接口参见官方文档https://developer.android.google.cn/reference/android/os/SharedMemory?hl=en跨进程使用(这里以传图片字节为例)一、服务端创建并存入数据: // 1、使用文件流把文件读入到内存 FileInputStream inputStr...

背景

工作中碰到一个需求,需要跨进程传输图片,项目中使用了android的SharedMemory,这里简单介绍下它的使用。

添加此功能的API

API level 27

类接口

参见官方文档
https://developer.android.google.cn/reference/android/os/SharedMemory?hl=en

跨进程使用(这里以传图片字节为例)

一、服务端创建并存入数据:

 // 1、使用文件流把文件读入到内存 FileInputStream inputStream = new FileInputStream(jpegFile); byte[] bytes = new byte[(int) jpegFile.length()]; inputStream.read(bytes); // 2、创建sharedMemory跨进程传输 SharedMemory sharedMemory = SharedMemory.create("test", bytes.length); // 3、mapReadWrite获取ByteBuffer ByteBuffer buffer = sharedMemory.mapReadWrite(); // 4、put数据 buffer.put(bytes); // 5、把sharedMemory权限设置为只读,create默认是读写权限都有,这里可以避免客户端更改数据 sharedMemory.setProtect(OsConstants.PROT_READ); // 6、使用完需要unmap SharedMemory.unmap(buffer); return sharedMemory; 

二、客户端获取数据显示

 // 1、通过aidl拿到SharedMemory SharedMemory sharedMemory = iService.takeScreenshot(); if (sharedMemory == null) { return; } // 2、mapReadOnly获取到存了数据的ByteBuffer ByteBuffer byteBuffer = sharedMemory.mapReadOnly(); int len = byteBuffer.limit() - byteBuffer.position(); byte[] bytes = new byte[len]; // 3、借助byteBuffer获取到数据 byteBuffer.get(bytes); // 4、把字节转换成bitmap并显示到imageView Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length); imageView.setVisibility(View.VISIBLE); imageView.setImageBitmap(bitmap); // 5、使用完unmap同时close sharedMemory释放内存 SharedMemory.unmap(byteBuffer); sharedMemory.close(); 

注意事项

1、服务端service销毁时,记得sharedMemory.close
2、服务端传输sharedMemory时,记得setProtect(OsConstants.PROT_READ)
3、客户端使用完sharedMemory,最好unmap下,避免内存占用

本文地址:https://blog.csdn.net/archie_7/article/details/109028160

相关标签: Android