(转)Android匿名共享内存demo篇(一)

更新时间:2023-06-09 21:05:02 阅读: 评论:0

(转)Android匿名共享内存demo篇(⼀)
Android系统的IPC⽅式通常为:⽂件、socket、binder、mesnger、AIDL、ContentProvider,此外还有个Anonymous Shared Memory(匿名共享内存),这篇⽂章介绍Ashm基础使⽤相关知识。
Android api27加⼊了类,27之前需要通过反射去拿到⽂件描述符。
demo为MainActivity和⼀个远程服务(指定了process的rvice)之间的通信,步骤如下:
1、创建aidl⽂件IMemoryAidlInterface
interface IMemoryAidlInterface{
ParcelFileDescriptor getParcelFileDescriptor();形神兼备
}
1、创建⼀个服务并在manifest⽂件中指定process
<rvice android:name=".MemoryFetchService"
android:process=":ashm"/>
在服务MemoryFetchService中创建共享内存虚拟⽂件并设置size,写⼊内容为⼀个数组。
真情故事
public class MemoryFetchService extends Service{
private static final String TAG ="MemoryFetchService";
private static final String SHM_FILE_NAME ="test_memory";
@Override
public IBinder onBind(Intent intent){
奶粉品牌排行榜return new MemoryFetchStub();
}小堂
static class MemoryFetchStub extends IMemoryAidlInterface.Stub{
@Override
public ParcelFileDescriptor getParcelFileDescriptor()throws RemoteException {
if(Build.VERSION.SDK_INT < Build.VERSION_CODES.O_MR1){
MemoryFile memoryFile = null;
try{
memoryFile =new MemoryFile(SHM_FILE_NAME,1024);
Method method = DeclaredMethod("getFileDescriptor");
FileDescriptor des =(FileDescriptor) method.invoke(memoryFile);
return ParcelFileDescriptor.dup(des);
}catch(Exception e){
Log.d(TAG,"getParcelFileDescriptor: exception : "+ e.toString());
}
}el{
//TODO u SharedMemory to get fd
}
return null;
}
}
}
在MainActivity中绑定服务,读取共享内存⽂件中的内容:
private void bind(){
Intent intent =new Intent(MainActivity.this, MemoryFetchService.class);
bindService(intent,new ServiceConnection(){
@Override
public void onServiceConnected(ComponentName name, IBinder rvice){图形图像处理
byte[] content =new byte[10];
梅花香自苦寒IMemoryAidlInterface iMemoryAidlInterface
= IMemoryAidlInterface.Stub.asInterface(rvice);
try{
ParcelFileDescriptor parcelFileDescriptor
陆游诗词= ParcelFileDescriptor();
FileDescriptor descriptor = FileDescriptor();
FileInputStream fileInputStream =new FileInputStream(descriptor);
int read = ad(content);
母亲节蛋糕
Log.d(TAG,"onServiceConnected: read == "+ read);
}catch(Exception e){
Log.d(TAG,"onServiceConnected: exception: "+ e.toString());
}
}
@Override
public void onServiceDisconnected(ComponentName name){
}
}, Service.BIND_AUTO_CREATE);
}
debug可以看到content中的内容即为在MemoryFetchService中写⼊的内容。
adb shell进⼊设备后,通过lsof|grep "test_memory"可以查看到创建的匿名共享内存虚拟⽂件:
130|Galileo:/ # lsof |grep "test_memory"
com.***.ash 27421    u0_a73  mem  unknown
到这⾥Android匿名共享内存简单使⽤demo已经完了,代码在clone。

本文发布于:2023-06-09 21:05:02,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/914218.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:共享内存   服务   创建   拿到   基础   内容
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图