• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Android > 从零开始怎么写android native service?

从零开始怎么写android native service?

作者:网友 字体:[增加 减小] 来源:互联网 时间:2017-05-26

网友通过本文主要向大家介绍了native service,从零开始学android,android从零开始,android开发从零开始,android从零开始pdf等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

从零开始怎么写android native service?


Android service对于从事android开发的人都不是一个陌生的东西,很多人可能会觉得服务很简单。服务是简单,因为复杂的别人做了,所以才会觉得简单。我们先梳理一下服务的分类,首先有本地服务跟系统服务的区分,而在APP里写的服务大多就成为Java服务或者应用服务。

做APP的人写个应用服务相对来说是最简单的,因为extends了一个service后几个简单的接口就可以跑起来了,写完这种服务可能也只是对服务一知半解,因为值钱的service类Google的人已经帮你写好了,这是你的福气为你带来了便利,当然也可能会麻痹你:),但是做APP的人会有能解决问题是首要任务了,有时间还是对它了解更清楚点比较好,在此不再讨论这个。

做设备做系统的人,经常可能会去写系统服务,也就是framework下面的服务,systemserver里面注册的服务,写这种服务一般来说比较少,只有做设备系统的才会这样干,才有机会有完成的系统代码,可以在里面自由遨游,笔者三年前写过一个,可以看看【自己动手从零开始写一个完整的android Service】

那剩下的一个是本地服务,也就是native service,这种服务我们了解的系统里面多媒体、audio system都是写成了本地服务,这样写的好处就是运行的效率更高一点,因为C/C++先天性就比JAVA的运行效率要高一点。笔者就是由于长期主要从事的都是底层开发的,我们有时有这么一种需求,又要运行效率高,又要好移植,主要是考虑推广写东西给广大客户,那么我就写一个本地服务,这样是最独立的了,效率也最高了,那一个本地服务到底怎么写呢?大多数的人写过的服务以java服务居多,真正写本地服务的不多,本地服务相对来说又是更复杂一点的。因此决定从零开始自己动手写一个本地service,下面就大概描述一下过程。

本地服务有四大块,服务接口(IService),服务代理(也就是BpService),服务stub(也就是BnService),服务实体(Service);下面笔者的实例就以demoNativeService来开启,力求简单,里面就写了两个接口;

首先定义好服务接口IdemoNativeService,IdemoNativeService服务接口的父类是IInterface,在里面主要是要声明一下接口,在DECLARE_META_INTERFACE(demoNativeService),代码如下:

 

class IdemoNativeService : public IInterface
{
public:
	enum {
		CONNECT = IBinder::FIRST_CALL_TRANSACTION,
		PRINTSTRING_CMD,
	};

public:
	DECLARE_META_INTERFACE(demoNativeService);
	virtual status_t connect(int pid,int previewhw,int intf,int fmt,int chan) = 0;
  virtual  status_t  printString(const char *str) = 0;

};

 

当然定义好了IdemoNativeService的头文件,就需要去实操了,先来搞定BpdemoNativeService,它的父类是BpInterface,这里面主要是涉及数据的跨进程用到的parcel,读啊,写啊,按套路来,也不难,也有AIDL工具可以使用,帮你转出来,再稍微修改一下就可以了,里面有一个很重要的remote,这个和remote就是幕后功臣啊,它保存了服务实例的对象啊,它是来之BpRefBase的一个成员,生成服务的时候,会得到赋值,定义完了以后,很重要的一个程序就是要IMPLEMENT_META_INTERFACE(demoNativeService,"android.hardware.IdemoNativeService");这个宏是非常重要的,跟前面那个DECLARE是对应的,前面声明,后面实现,当然我们带的参数跟的名字是必须一致的,这样才能正常沟通嘛!

 

class BpdemoNativeService: public BpInterface
{
public:
	BpdemoNativeService(const sp& impl)
	: BpInterface(impl)
	{
	}

	virtual status_t connect(int pid,int previewhw,int intf,int fmt,int chan)
	{
		Parcel data, reply;
		data.writeInterfaceToken(IdemoNativeService::getInterfaceDescriptor());
		data.writeInt32(pid);
		data.writeInt32(previewhw);
		data.writeInt32(intf);
		data.writeInt32(fmt);
		data.writeInt32(chan);
		remote()->transact(IdemoNativeService::CONNECT, data, &reply);
		return reply.readInt32();
	}

  virtual  status_t  printString(const char *str)
  {
    Parcel data, reply;
    data.writeInterfaceToken(IdemoNativeService::getInterfaceDescriptor());
    data.writeCString(str);
    remote()->transact(IdemoNativeService::PRINTSTRING_CMD, data, &reply);
		return reply.readInt32();
  }
};

IMPLEMENT_META_INTERFACE(demoNativeService, "android.hardware.IdemoNativeService");//android.hardware.IdemoNativeService ds.demonativeservice

 

接着需要写服务stub了,BndemoNativeService的父类是BnInterface,有没有发现BndemoNativeService跟BpdemoNativeService,都会基于接口类IdemoNativeService,这样沟通起来的接口就唯一了,就具备了对话的可能;

 

class BndemoNativeService: public BnInterface
{
public:
	virtual status_t onTransact( uint32_t code,const Parcel& data,Parcel* reply,uint32_t flags = 0);
};
status_t BndemoNativeService::onTransact(uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
{
	switch(code)
	{
		/*case CONNECT: {
			CHECK_INTERFACE(IdemoNativeService, data, reply);
			int pid         = data.readInt32();
			int previewhw   = data.readInt32();
			int intf        = data.readInt32();
			int fmt         = data.readInt32();
			int chan        = data.readInt32();
			reply->writeInt32(connect(pid,previewhw,intf,fmt,chan));
			return NO_ERROR;
			}break;
		case PRINTSTRING_CMD: {
			CHECK_INTERFACE(IdemoNativeService, data, reply);
			const char *str;
      str = data.readCString();
			reply->writeInt32(printString(str));
			return NO_ERROR;
			}break;*/

		default:
			return BBinder::onTransact(code, data, reply, flags);
	}
}

 

到这就轮到了大块头service实体demoNativeService了,demoNativeService是基于BndemoNativeService,在demoNativeService里面定义了一个instantiate()接口用于添加service到servicemanager里面去,注意demoNativeService()跟析构函数~demoNativeService()需要写成private的,免得别人可以new出对象来。在里面重写了onTransact,一旦BpdemoNativeService有风吹草动,就会联动到BndemoNativeService,因为服务实体重写了onTransact,所以实际就会先执行到demoNativeService::onTransact这里来,在这里面处理不了,可以再转给BpdemoNativeService的onTransact或者直接到BBinder的onTransact;

 

void demoNativeService::instantiate() {
	android::defaultServiceManager()->addService(
                IdemoNativeService::descriptor, new demoNativeService());
}

demoNativeService::demoNativeService()
{
    ALOGE("demoNativeService created");
    mOpened = 1;
}

demoNativeService::~demoNativeService()
{
    ALOGE("demoNativeService destroyed");
}

 status_t  demoNativeService::connect(int pid,int previewhw,int intf,int fmt,int chan){
 	
    ALOGD("demoNativeService connect:%d, %d, %d, %d, %d", pid, previewhw, intf, fmt, chan);
   	return 88;
 	
}

 status_t  demoNativeService::printString(const char *str){
 	  ALOGD("demoNativeService printString:%s", str);
   	return 66; 
}
     
#if 1       
 status_t demoNativeService::onTransact(uint32_t code,
                                                const android::Parcel &data,
                                                android::Parcel *reply,
                                                uint32_t flags)
{
        ALOGD("OnTransact(%u,%u)", code, flags);
        
        switch(code) {
 		case CONNECT: {
			CHECK_INTERFACE(IdemoNativeService, data, reply);
			int pid         = data.readInt32();
			int previewhw   = data.readInt32();
			int intf        = data.readInt32();
			int fmt         = data.readInt32();
			int chan        = data.readInt32();
			
      ALOGD("CONNECT: %d, %d, %d, %d, %d\n", pid,previewhw,intf,fmt,chan);
			reply->writeInt32(connect(pid,previewhw,intf,fmt,chan));
			return NO_ERROR;
			}break;
			       	        	
        case PRINTSTRING_CMD: {
                CHECK_INTERFACE(IdemoNativeService, data, reply);
                const char *str;
                str = data.readCString();
                ALOGD("PrintString: %s\n", str);
                ALOGD("printString: %s\n", str);
								reply->writeInt32(printString(str));
                return NO_ERROR;
        } break;
        default:
                return BndemoNativeService::onTransact(code, data, repl



 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 从零开始怎么写android native service?

相关文章

  • 2017-05-26硅谷新闻2--禁止viewpager预加载,2--viewpager
  • 2017-05-26Android通知栏沉浸式/透明化完整解决方案,root不完整解决方法
  • 2017-05-26linux和android调试工具介绍及方法汇总
  • 2017-05-26Android菜单项内容大全,android菜单项大全
  • 2017-05-26androidStudio通过svn进行版本控制,androidstudiosvn
  • 2017-05-26Android群英传笔记系列一view的介绍,android群英
  • 2017-05-26Android 五大布局,android五大布局
  • 2017-05-26android Fragment详细讲述,包括问题隐患
  • 2017-05-26Android 系统版本&API对照表,android系统版本
  • 2017-05-26修改Android系统关机动画,android关机动画

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • Handler消息传递机制(一)
    • andriod 获得drawable下所有图片,
    • Android GreenDAO3.0——介绍,androidgreendao3.0
    • Android GreenDAO3.0——entity建模,androidgreendao3.0
    • Android-将RGB彩色图转换为灰度图,
    • 【转载】ReactiveX 的理念和特点,转载reactivex理念
    • Android6.0系统增加那些新特性
    • Kotlin的数据类:节省很多行代码(KAD 10),kotlin很多行
    • android计算每个目录剩余空间丶总空间以及SD卡剩余空间,androidsd
    • 一个简单的Makefile编译框架

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有