Binder Bp 在不同进程中被使用

场景:

1)IMediaPlayer.cpp

Bn -> Bp

sp<IGraphicBufferProducer> bufferProducer =

interface_cast<IGraphicBufferProducer>(data.readStrongBinder());

reply->writeInt32(setVideoSurfaceTexture(bufferProducer));

在mediaplayerservice中使用
     sp<IGraphicBufferProducer>& bufferProducer 该Bp 与Bn 交互

2) 将mediaplayerservice进程中该Bp对象传递给另外一个进程中使用

virtual status_t connect(const sp<IGraphicBufferProducer> &bufferProduce,    sp<IRemoteDisplayClient> &sinkClient)

{

Parcel data, reply;

data.writeInterfaceToken(IRemoteDisplay::getInterfaceDescriptor());

data.writeStrongBinder(IInterface::asBinder(bufferProduce));

data.writeStrongBinder(IInterface::asBinder(sinkClient));

remote()->transact(CONNECT, data, &reply);

return reply.readInt32();

}

status_t BnRemoteDisplay::onTransact(..........){.........

case CONNECT:{

CHECK_INTERFACE(IRemoteDisplay, data, reply);

sp<IGraphicBufferProducer> bufferproducer = IGraphicBufferProducer::asInterface(data.readStrongBinder());  //从mediaplayerservice进程中获取到的Bp对象在这边也可以被使用

sp<IRemoteDisplayClient> clientsink =  interface_cast<IRemoteDisplayClient>(data.readStrongBinder());

reply->writeInt32(connect(bufferproducer,clientsink));

return NO_ERROR;

}

3) 一个BnXX  可以被多个类继承,然后在不同接口处 得到的Bp

return interface_cast<IRemoteDisplay>(reply.readStrongBinder());

自身能够区分出来对应是哪个类的Bn

<IRemoteDisplay> 与RemoteDisplay 不是一一对应, IRemoteDisplay 可能对应多个类

时间: 2024-10-21 14:18:58

Binder Bp 在不同进程中被使用的相关文章

Android系统在新进程中启动自定义服务过程(startService)的原理分析

在编写Android应用程序时,我们一般将一些计算型的逻辑放在一个独立的进程来处理,这样主进程仍然可以流畅地响应界面事件,提高用户体验.Android系统为我们提供了一个Service类,我们可以实现一个以Service为基类的服务子类,在里面实现自己的计算型逻辑,然后在主进程通过startService函数来启动这个服务.在本文中,将详细分析主进程是如何通过startService函数来在新进程中启动自定义服务的. 在主进程调用startService函数时,会通过Binder进程间通信机制来

Android应用程序在新的进程中启动新的Activity的方法和过程分析

Android应用程序在新的进程中启动新的Activity的方法和过程分析 - 老罗的Android之旅 - 博客频道 - CSDN.NET ? ? ? ?前面我们在分析Activity启动过程的时候,看到同一个应用程序的Activity一般都是在同一个进程中启动,事实上,Activity也可以像Service一样在新的进程中启动,这样,一个应用程序就可以跨越好几个进程了,本文就分析一下在新的进程中启动Activity的方法和过程. ?? ? ? ?在前面Android进程间通信(IPC)机制B

获取其他进程中“Internet Explorer_TridentCmboBx”的内容

function GetTridentCmboBxText( // 获取其他进程中“Internet Explorer_TridentCmboBx”的内容   mHandle: THandle; // ComboBox句柄   mStrings: TStrings // 输出列表 ): Boolean; // 返回获取数据是否成功 var   I: Integer;   vItemCount: Integer;   vAddress: array[0..4] of Char;   vProces

获取其他进程中StatusBar的文本

(*// 标题:获取其他进程中StatusBar的文本 说明:Window2000+Delphi6调试通过 设计:Zswang 支持:[email protected] 日期:2005-02-22 //*) uses CommCtrl; function GetStatusBarText(mHandle: THandle): string; var   vBuffer: array[0..$1000] of Char;   vSize: Integer;   I: Integer;   vCou

(转)同一进程中的线程究竟共享哪些资源

线程共享的环境包括:进程代码段.进程的公有数据(利用这些共享的数据,线程很容易的实现相互之间的通讯).进程打开的文件描述符.信号的处理器.进程的当前目录和进程用户ID与进程组ID. 进程拥有这许多共性的同时,还拥有自己的个性.有了这些个性,线程才能实现并发性.这些个性包括: 1.线程ID      每个线程都有自己的线程ID,这个ID在本进程中是唯一的.进程用此来标识线程. 2.寄存器组的值       由于线程间是并发运行的,每个线程有自己不同的运行线索,当从一个线程切换到另一个线程上时,必须

Linux进程的栈和进程中函数的栈帧

主要理解了Linux进程的栈和函数的栈帧的区别和联系 上图中刻画的是一个Linux进程的结构图,其中本文想要关注的栈如上图所示是栈底在0xc0000000地址递减的一块进程内存区域 Linux系统中为每个进程分配的实际大小未做深究 Linux进程的栈的整体认知就是这么多,即 1)栈底在0xc0000000(并不需要栈底指针,函数的栈帧才需要栈底指针) 2)栈的增长方向,地址递减方向 3)栈顶指针esp 4)大小未知(不是本文关注的重点) 5)里面存放的内容是什么呢? 另一个概念是上文中提到的函数

Android 子Activity组件在进程内的启动过程 &amp;&amp; 子Activity组件在新进程中的启动过程

1.子Activity组件在进程内的启动过程 在Android Activity组件的启动过程http://blog.csdn.net/jltxgcy/article/details/35984557一文中,我们已经详细分析了Activity的启动过程,对于子Activity组件在进程内的启动过程,我们只分析它们之间的不同. 主要是2处,1是不需要创建新的任务栈,2是不需要创建新进程和子线程. 第1点,体现在如下代码上: -/Android/frameworks/base/services/ja

学习笔记之卸载远程目标进程中的DLL模块(转)

学习笔记之卸载远程目标进程中的DLL模块 (2007-07-23 23:51:02) 转载▼ 学习笔记之卸载远程目标进程中的DLL模块2007/7/231.首先得把DLL模块中的线程结束使用CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD,0);创建系统线程的快照然后用Thread32First()和Thread32Next()遍历系统中所有线程.将遍历到的线程保存到THREADENTRY32结构,然后判断结构中的th32OwnerProcessID成员是否与

任务管理器进程中多个chrome.exe的问题

偶然发现任务管理器进程中有多个chrome.exe进程,非常奇怪自己仅仅打开了一次浏览器,为什么会有多个?! 上网一查才发现:原来使用Google浏览器Google Chrome每开一个新标签页面,都会在系统进程里增加一个Chrome.exe进程. Chrome开源计划的当中一个特点,就是"沙箱"模式,是这种,一个拓展占用一个进程,一个标签占用一个进程,这就是防止一个当中一个页面或者拓展崩溃后,造成整个浏览器崩溃的问题.总的来说,这是一个非常创新的技术.IE浏览器,尽管集成的仅仅有一个