android binder机制之——(创建binder服务)
Binder机制编程
前面的几篇文章具体介绍了android中binder机制的方方面面,相信你对binder机制已经有了较深刻的理解。俗话说得好“学以致用”,以下我们就通过在android系统中创建一个我们自己的binder服务,来加深对binder机制的理解。
(1)增加新建的服务名称
在service_manager.c文件里有一个结构数组allowed,在allowed结构体数组中增加新建的服务名称
static struct {
unsigned uid;
const char *name;
} allowed[] = {
#ifdef LVMX
{ AID_MEDIA, "com.lifevibes.mx.ipc" },
#endif
{ AID_MEDIA, "media.audio_flinger" },
{ AID_MEDIA, "media.player" },
{ AID_MEDIA, "media.camera" },
{ AID_MEDIA, "media.audio_policy" },
{ AID_RADIO, "radio.phone" },
{ AID_RADIO, "radio.sms" },
{ AID_RADIO, "radio.phonesubinfo" },
{ AID_RADIO, "radio.simphonebook" },
/* TODO: remove after phone services are updated: */
{ AID_RADIO, "phone" },
{ AID_RADIO, "isms" },
{ AID_RADIO, "iphonesubinfo" },
{ AID_RADIO, "simphonebook" },
{AID_NEW, "newservice"}
};
(2)定义ImyService类
定义一个继承自IInterface的接口类,须是以大写字母I開始,以IMyService为例接口函数必须为纯虚函数,以便在子类中生产,在定义接口时将DECLARE_META_INTERFACE宏放进接口类定义中,这个宏的最重要作用是将代理对象BpBinder转化成本地封装的服务代理对象(在这里是BpMyService对象),代码大致例如以下:
Class ImyService:public IInterface
{
Public:
DECLARE_META_INTERFACE(MyService);
Virtual fun1() = 0;
Virtual fun2() = 0;
}
(3)定义一个本地实现类BnMyService
在IMyService.h头文件里定义接口实现类BnMyService, 需继承自BnInterface,间接双继承了IMyService接口类和BBinder类,代码例如以下:
Class BnMyService:public BnInterface<IMyService>
{
Public:
Virtual status_t onTransact(uint32_t code,
const Parcel& data,
Parcel* reply,
uint32_t flags = 0);
}
(4)定义本地代理类BpMyService
在IMyService.cpp源文件里,定义接口代理类BpMyService,需继承自BpInterface。BpMyService能够提供IMyService接口所定义的接口函数。
class BpMyService: public BpInterface<IMyService>
{
public:
BpMyService(const sp<IBinder>& impl)
: BpInterface<IMyService>(impl)
{
}
void fun1()
{
Parcel data, reply;
…… //数据写入
remote()->transact(枚举量, data, &reply);
return …… //数据返回
}
……
}
(5)增加宏定义
在IMyService.cpp源文件里,增加宏定义IMPLEMENT_META_INTERFACE()
IMPLEMENT_META_INTERFACE(MyService, "XXX");
(6)定义BnMyService的onTransact()函数
在IMyService.cpp源文件里实现接口实现类BnMyService,当中onTrasact()函数依据功能代码枚举量的不同分别运行不同的功能调用。
status_t BnMyService::onTransact(
uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
{
switch(code) { //code功能代码枚举量
case功能代码枚举量: {
LOGV("NOTIFY_CALLBACK");
CHECK_INTERFACE(ICameraClient, data, reply); //检查描写叙述符字符串
…… //參数输入,接口函数功能的真正实现
reply->……); //返回数据
return NO_ERROR;
} break;
……
default:
return BBinder::onTransact(code, data, reply, flags);
}
}
(7)创建真正的本地接口实现类MyService类
在头文件里定义类MyService,继承自BnInterface,定义功能函数和初始化函数instantiate():
Class MyService:public BnMyService
{
Public:
Static void instantiate();
Virtual func1();
Virtual func2();
……
}
(8)定义MyService::instantiate()函数
void MyService::instantiate() {
defaultServiceManager()->addService(
String16("newservice"), new MyService());
}
(9)服务进程中注冊服务
在服务进程A初始化时增加MyService:: instantiate()函数,注冊服务,调用joinThreadPool()函数进入循环等待调用,侦听请求、处理请求。
int main(int argc, char** argv)
{
sp<ProcessState> proc(ProcessState::self());
sp<IServiceManager> sm = defaultServiceManager();
LOGI("ServiceManager: %p", sm.get());
MyService::instantiate();
……
ProcessState::self()->startThreadPool();
IPCThreadState::self()->joinThreadPool();
}
(10)client获取服务代理对象
client进程B要想和服务端通讯,首先须要获取服务管家ServiceManager的代理对象,,然后查找服务,由于服务已经注冊,所以会返回一个该服务代理对象的引用,此代理对象中包括一个指向查找的服务的handle句柄。
const sp<IMyService>& MyServiceSystem::get_MyService()
{
Mutex::Autolock _l(mLock);
if (gMyService.get() == 0) {
sp<IServiceManager> sm = defaultServiceManager(); //获取服务管家的代
//理对象
sp<IBinder> binder;
do {
binder = sm->getService(String16("newservice")); //查找到服务后,
//返回服务的代理对象
……
} while(true);
……
gMyService = interface_cast<IMyService>(binder); //将其转换为本地服
//务代理对象(BpMyService)
……
}
……
return mMyService;
}
(11)client调用服务端函数
client进程B调用IMyService的接口函数,调用会传递给包括了服务对象handle的代理对象BpBinder,写入binder内核驱动。binder驱动知道数据传递到的对象,于是将数据传递给进程A。
服务端进程A从binder驱动中读取数据,然后处理远程调用,然后发送reply数据给binder驱动。binder驱动将reply传递给client进程B。进程B从binder驱动中读取数据并最终获取到reply,从而完毕进程通信。
Status_t MyServiceSystem::func1()
{
Const sp<IMyService>& af = MyServiceSystem::get_MyService();
Af::Func1();
……
}
到这里,我们已经把android中的binder机制介绍完了。呵呵,本来认为binder机制总结起来不会非常难,可在写总结的过程中还是遇到了非常多问题。呵呵,只是还好,都差点儿相同一一攻克了,最终写完了。总结过程中相当于又学了一边binder机制,并且还有新的收获,真的不错哦!
android binder机制之——(创建binder服务)的更多相关文章
- 【转】Android - Binder机制
以下几篇文章是分析binder机制里讲得还算清楚的 目录 1. Android - Binder机制 - ServiceManager 2. Android - Binder机制 - 普通servic ...
- Android 进阶8:进程通信之 Binder 机制浅析
读完本文你将了解: IBinder Binder Binder 通信机制 Binder 驱动 Service Manager Binder 机制跨进程通信流程 Binder 机制的优点 总结 Than ...
- Android系统Binder机制学习总结
一.Binder机制概述 在Android开发中,很多时候我们需要用到进程间通信,所谓进程间通信,实现进程间通信的机制有很多种,比如说socket.pipe等,Android中进程间通信的方式主要有三 ...
- Android应用中创建绑定服务使得用户可以与服务交互
原文:http://android.eoe.cn/topic/android_sdk 一个绑定的服务是客户服务器接口上的一个服务器.一个绑定的服务允许组件(如:活动)来绑定一个服务,传送请求,接收响应 ...
- AIDL Service Android进程间通信机制
转载出处:http://www.apkbus.com/home.php?mod=space&do=blog&uid=664680&id=59465 我们知道,在Android ...
- 自顶向下分析Binder【1】—— Binder实例篇
欢迎转载,转载请注明:http://blog.csdn.net/zhgxhuaa 一个Binder实例 我们Binder的学习将从以下的一个实例開始.依据Android文档中的描写叙述,创建一个Bin ...
- 快速了解Android重要机制
转自 http://www.jianshu.com/p/5f6d79323923 一.Android系统底层研究 关于底层的知识点不是在一篇文章中能讲解清楚,参见本人的Android底层研究系列,不断 ...
- Android中的Binder机制的简要理解
转载自:http://www.linuxidc.com/Linux/2012-07/66195.htm http://blog.csdn.net/sunxingzhesunjinbiao/articl ...
- Android深入浅出之Binder机制
一说明 Android系统最常见也是初学者最难搞明白的就是Binder了,很多很多的Service就是通过Binder机制来和客户端通讯交互的.所以搞明白Binder的话,在很大程度上就能理解程序运行 ...
随机推荐
- ViewPager控件的Demo
1.主视图 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:to ...
- 菜鸟学习SSH(二)——Struts国际化
国际化(internationalization,i18n)和本地化(localization,l10n)指让产品(出版物,软件,硬件等)能够适应非本地环境,特别是其他的语言和文化.程序在不修改内部代 ...
- JavaScript DOM省市自适配select菜单
<html> <head> <meta charset="UTF-8"> <meta name="Generator" ...
- 知识点3-6:HTML辅助方法
顾名思义,HTML辅助方法(HTML Helper)就是用来辅助产生HTML之用,在开发View的时候一定会面对许多HTML标签,处理这些HTML的工作非常繁琐,为了降低View的复杂度,可以使用HT ...
- 国产CPU走到十字路口:谁来取代英特尔芯片?(少写了一个OpenPower)
国内的几支CPU研发力量各自选择的指令体系都有自己的优点和问题,选择其中的哪一支都会有对应的成本和风险.最终谁能担大任,且拭目以待. 文 | 瞭望智库特约科技观察员 王强 用上内置国产CPU的个人电脑 ...
- QThread 与 QObject的关系(QObject可以用于多线程,可以发送信号调用存在于其他线程的slot函数,但GUI类不可重入)
QThread 继承 QObject..它可以发送started和finished信号,也提供了一些slot函数. QObject.可以用于多线程,可以发送信号调用存在于其他线程的slot函数,也可以 ...
- first-,second- and third-class value
In computer science, a programming language is said to have first-class functions if it treats funct ...
- poj3819 Coverage (求直线与圆的交占直线的百分比 )
题意:给你一条直线和若干个圆,求圆与直线相交的长度占整条直线的比例 解题思路:通过定比分点的方法求出圆与直线的交占圆的比例. 第一步:(确定投影的方向是x轴还是y轴) (1)当直线的line.s(x, ...
- vbox要手动mount才能挂载windows的共享文件夹(好用,不用安装samba了)
mount -t vboxsf BaiduShare /mnt/bdshare/ 我按照这篇文章成功: http://www.wuji8.com/meta/448016166.html 其它参考: h ...
- C语言声明解析方法
1.C语言声明的单独语法成份 声明器是C语言声明的非常重要成份,他是所有声明的核心内容,简单的说:声明器就是标识符以及与它组合在一起的任何指针.函数括号.数组下表等,为了方便起见这里进行分类表 ...