实现一个binder通信实例,需要经过以下步骤: (一)获得ServiceManager的对象引用 (二)向ServiceManager注册新的Service (三)在Client中通过ServiceManager获得Service对象引用 (三)在Client中发送请求,由Service返回结果。 下面看具体的代码如何实现。 三.一 libmyservice代码实现 (一)新建目录frameworks/base/myservice/libservice,进入该目录 view plain $ cd frameworks/base $ mkdir myservice $ cd myservice $ mkdir libmyservice $ cd libmyservice (二)编写libmyservice/myservic.h文件 view plain #include threads.h #include RefBase.h #include IInterface.h #include BpBinder.h #include Parcel.h namespace android { class MyService : public BBinder { mutable Mutex mLock; int三二_t mNextConnId; public: static int instantiate(); MyService(); virtual ~MyService(); virtual status_t onTransact(uint三二_t, const Parcel, Parcel*, uint三二_t); }; }; //namespace (二)编写libservice/myservice.cpp文件 view plain #include "myservice.h" #include IServiceManager.h #include IPCThreadState.h namespace android { static struct sigaction oldact; static pthread_key_t sigbuskey; int MyService::instantiate() { LOGE("MyService instantiate"); // defaultServiceManager ()获得ServiceManager的对象引用,addService()可向ServiceManager注册新的服务 int r = defaultServiceManager()-addService(String一陆("android.myservice"), new MyService()); LOGE("MyService r = %d/n", r); return r; } MyService::MyService() { LOGV("MyService created"); mNextConnId = 一; pthread_key_create(sigbuskey, NULL); } MyService::~MyService() { pthread_key_delete(sigbuskey); LOGV("MyService destroyed"); } // 每个系统服务都继承自BBinder类,都应重写BBinder的onTransact虚函数。当用户发送请求到达Service时,系统框架会调用Service的onTransact函数,该函数分析接收到的数据包,调用相应的接口函数处理请求 status_t MyService::onTransact(uint三二_t code, const Parcel data, Parcel* reply, uint三二_t flags) { switch(code) { case 0: { pid_t pid = data.readInt三二(); int num = data.readInt三二(); num = num + 一00; reply-writeInt三二(num); return NO_ERROR; } break; default: return BBinder::onTransact(code, data, reply, flags); } } }; //namespace (三)编写libservice/Android.mk文件 view plain # File: Android.mk LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_SRC_FILES := myservice.cpp LOCAL_C_INCLUDES := $(JNI_H_INCLUDE) LOCAL_SHARED_LIBRARIES := libutils libbinder LOCAL_MODULE_TAGS := optional LOCAL_PRELINK_MODULE := false LOCAL_MODULE := libmyservice include $(BUILD_SHARED_LIBRARY) (四)编译libmyservice.so动态库 在android源码主目录下 view plain $ source build/envsetup.sh including device/htc/passion/vendorsetup.sh including device/samsung/crespo四g/vendorsetup.sh including device/samsung/crespo/vendorsetup.sh $ mmm frameworks/base/myservice/libmyservice/ 编译成功后生成文件:out/target/product/generic/system/lib/libmyservice.s
公司主营业务:成都做网站、成都网站制作、移动网站开发等业务。帮助企业客户真正实现互联网宣传,提高企业的竞争能力。成都创新互联是一支青春激扬、勤奋敬业、活力青春激扬、勤奋敬业、活力澎湃、和谐高效的团队。公司秉承以“开放、自由、严谨、自律”为核心的企业文化,感谢他们对我们的高要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。成都创新互联推出海伦免费做网站回馈大家。
表达式是什么?所有人都知道。“1+1=2”,这个“1+1”就是最典型的表达式。
用来指定数据做哪种运算的符号是“运算符”,进行运算的数据称为“操作数”。例如:“2+3"中的“+”是运算符,“2”和“3”是操作数。
运算符根据操作数的个数分为单目运算符和双目运算符:
单目运算符,只有一个操作数,例如“-100”中 的“-”,单目运算符位于操作数的前面;
双目运算符,具有二哥操作数的运算符,例如“100-30”中的“-”,双目运算符位于二个操作数之间。
1、input命令
print命令用于输出数据,而input命令与print命令相反,它是让用户由“标准输入”设备输入数据,如果没有特别设置,标准输入设备是指键盘。input命令是非常常用的命令,比如,教师若要用电脑计算成绩,则首先要从键盘输入学生成绩。语法如下:
变量 = input([提示字符串])
用户输入的数据存储在指定的变量中。
“提示字符串”表示输出一段提示信息,用来告诉用户如何输入。输入数据时,当用户按下Enter键后被认为是输入结束,input命令会把用户输入的数据存入变量中。
例如,让用户输入数学成绩并输出程序:
2、运算符
python支持以下几种运算符(常用):
算术运算符:用于执行普通数学运算的运算符
例如:假设变量a = 10,变量b = 20
关系运算符:用于二个表达式之间的比较,若比较结果为真,返回True;否则为False
例如:假设变量a=10,变量b=20
赋值运算符:先给变量赋值,在运算的运算符
例如:假设变量a=10,变量b=20
逻辑运算符:用于逻辑运算的运算符
例如:假设变量a=10,变量b=20
按位运算符:把数字看成二进制来计算的
例如:假设变量a = 60(换成二进制为111100), 变量b = 13(换成二进制为1101)
运算符优先级:自上而下,依次升高
在进行新纪元时间(1970-01-01 00:00:00)以来的秒到实际时间之间转换的时候 MySQL 根据参数 time_zone 的设置有两种选择:
time_zone 设置为 SYSTEM 的话:使用 sys_time_zone 获取的 OS 会话时区,同时使用 OS API 进行转换。对应转换函数 Time_zone_system::gmt_sec_to_TIME
time_zone 设置为实际的时区的话:比如 ‘+08:00’,那么使用使用 MySQL 自己的方法进行转换。对应转换函数 Time_zone_offset::gmt_sec_to_TIME
实际上 Time_zone_system 和 Time_zone_offset 均继承于 Time_zone 类,并且实现了 Time_zone 类的虚函数进行了重写,因此上层调用都是 Time_zone::gmt_sec_to_TIME。
Python是一门跨平台、开源、免费的解释型高级动态编程语言。
除了解释执行,Python还支持伪编译将源代码转换为字节码来优化程序提高运行速度和对源代码进行保密,并且支持使用py2exe、pyinstaller、cx_Freeze或其他类似工具将Python程序及其所有依赖库打包为扩展程序名exe的可执行程序,从而可以脱离Python解释器环境和相关依赖库而在Windows平台上独立运行。
Python支持命令式编程、函数式编程、完全支持面向对象程序设计,语法简洁清晰,并且拥有大量的几乎支持所有领域应用开发的成熟扩展库;也有人喜欢把Python称为"胶水语言”,因为它可以把多种不同语言编写的程序融合到一起实现无缝拼接,更好得发挥不同语言和工具的优势,满足不同应用领域的需求。
语言特点
简单:Python是一种代表简单主义思想的语言。阅读一个良好的Python程序就感觉像是在读英语一样。它使你能够专注于解决问题而不是去搞明白语言本身。
易学:Python极其容易上手,因为Python有极其简单的说明文档。
易读、易维护:风格清晰划一、强制缩进。
速度快:Python的底层是用C语言写的,很多标准库和第三方库也都是用C写的,运行速度非常快。
免费、开源:Python是FLOSS(自由/开放源码软件)之一。使用者可以自由地发布这个软件的拷贝、阅读它的源代码、对它做改动、把它的一部分用于新的自由软件中。FLOSS是基于一个团体分享知识的概念。
Python中的变量不需要声明。每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。
Python3中有六个标准的数据类型:Number(数字)+String(字符串)+List(列表)+Tuple(元组)+Sets(集合)+Dictionary(字典)。
Number(数字)数字类型是顾名思义是用来存储数值的,需要记住的是,有点和Java的字符串味道差不多,如果改变了数字数据类型的值,将重新分配内存空间。
可以使用del语句删除一些数字对象的引用delvar1[,var2[,var3[....,varN]]]]。Python支持三种不同的数值类型:
1.整型(Int)-通常被称为是整型或整数,是正或负整数,不带小数点。
Python3整型是没有限制大小的,可以当作Long类型使用,所以Python3没有Python2的Long类型。
2.浮点型(float)-浮点型由整数部分与小数部分组成,浮点型也可以使用科学计数法表示(2.5e2=2.5x102=250)
3.复((complex))-复数由实数部分和虚数部分构成,可以用a+bj,或complex(a,b)表示,复数的实部a和虚部b都是浮点型。数字类型转换1.int(x)将x转换为一个整数。
4.complex(x,y)将x和y转换到一个复数,实数部分为x,虚数部分为y。x和y是数字表达式。
Python基本数据类型一般分为:数字、字符串、列表、元组、字典、集合这六种基本数据类型。
其中数字又包含整型(整型又包括标准整型、长整型(Python2.7及之前版本有))、浮点型、复数类型、布尔型(布尔型就是只有两个值的整型)、这几种数字类型。列表、元组、字符串都是序列。
1、数字
数字类型是不可更改的对象。对变量改变数字值就是生成/创建新的对象。Python支持多种数字类型:
整型(标准整型和长整型(Python2.7及之前的有这种类型))、布尔型、双精度浮点型、十进制浮点型、复数。
2、标准整型
int,标准整型,在大多数32位机器上标准整型取值范围是-2^31到2^31-1,也就是-2147483648~2147483647,如果在64位机器使用64位编译器,那么这个系统的标准整型将是64位。
3、布尔型
bool,从Python2.3开始Python中添加了布尔类型。布尔类型有两种True和False。对于没有__nozero__方法的对象默认是True。
对于值为0的数字、空集(空列表、空元组、空字典等)在Python中的布尔类型中都是False。
bool(1)
True
bool('a')
True
bool(0)
False
bool('')
False
4、浮点型
float,每个浮点型占8个字节(64位),完全遵守IEEE754号规范(52M/11E/1S),其中52个位用于表示底,11个位用于表示指数(可表示的范围大约是±10**308.25),剩下的一个位表示符号。这看上去相当完美,然而,实际精度依赖于机器架构和创建Python解释器的编译器。
浮点型值通常都有一个小数点和一个可选的后缀e(大写或小写,表示科学计数法)。在e和指数之间可以用正(+)或负(-)表示指数的正负(正数的话可以省略符号)。
以上是Python核心编程的对浮点型(双精度浮点型)的说明。经过Python实测浮点型默认长度是24字节如果超出这个范围会自动
5、复数类型
complex,在复数中虚数不能单独存在,它们总是和一个值为0.0的实数部分一起来构成一个复数。复数由实数部分和虚数部分构成。表示虚数的语法:real+imagj。
实数部分和虚数部分都是浮点型。虚数部分必须有后缀j或J。