背景
作業中碰到一個需求,需要跨行程傳輸圖片,專案中使用了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://www.uj5u.com/qianduan/170673.html
標籤:其他
上一篇:Chartles功能介紹
