Android service 实现过程
- 格式:doc
- 大小:299.57 KB
- 文档页数:15
service工作原理service是Android平台上的一种组件,用于在后台执行长时间运行的操作或处理来自其他组件的请求。
它可以在应用程序的主线程之外运行,因此不会阻塞用户界面(UI)的操作。
Service运行在相对独立的进程中,因此即使在应用程序被销毁或不可见时,它仍然可以继续运行。
Service可以分为两种类型:启动式和绑定式。
启动式服务通过startService()方法来启动,不与调用者之间建立直接的链接。
它们在后台独立运行,无需依附于调用者的生命周期。
绑定式服务则通过bindService()方法绑定到调用者,与调用者之间建立一对一的链接。
这种服务的生命周期与调用者的生命周期相关联。
Service的工作原理如下:1. 在应用程序中创建一个继承自Service基类的子类,并重写其onCreate()、onStartCommand()和onDestroy()方法(对于绑定式服务,还需重写onBind()和onUnbind())。
2. 在应用程序的清单文件中声明该Service组件,以便系统可以识别并启动它。
可以通过设置属性android:exported为true或false来指定Service是否可以被其他应用程序访问。
3. 在需要启动或绑定Service的地方,调用startService()或bindService()方法。
通过Intent可以传递操作和数据给Service。
4. 如果是启动式服务,调用者与Service之间没有直接的链接,Service会在后台独立运行。
它会在调用startService()方法后立即调用onStartCommand()方法,在这个方法里可以执行耗时的操作。
5. 如果是绑定式服务,调用者与Service建立起一对一的链接。
调用bindService()方法后,会触发Service的onBind()方法,在这个方法里可以返回一个提供给调用者进行交互的Binder对象。
题外话:由于同事咨询,口头讲解的话1对1,但不方便多方传播及继承性,因此特意写此文章讲解一番。
1、android service简要说明:Android Service:又称为Java Service,是实现在框架层里的Service,使用Java语言编写。
Native Service:又称为System Service,是实现在Runtime层里的Service。
使用C++语言编写。
对于这两种service来说,两个对等service通讯都是利用binder,只不过一种利用*.aidl,一种利用IInterface编写序列化代码而已,本质是一样的,本书先介绍native service的编写及两个native service如何通讯的过程:2、native service的特点A、因为底层核心服务是Android框架里最接近Linux/Driver的部分。
为了充分发挥硬件设备的差异化特性,核心服务是让上层Java应用程序来使用Driver/HW Device特色的重要管道。
B、在开机过程中,就可以启动核心服务(例如汉字输入法服务等),让众多应用程序来共享之。
C、由于共享,所以能有效降低程序的大小及统一的接口变化。
3、如何实现一个native service要点如下:a、核心服务通常在独立的进程(Process)里执行。
b、必须提供IBinder接口,让其它程序可以进行跨进程的绑定(Binding)和呼叫。
c、因为共享,所以必须确保多线程安全(Thread-safe)。
d、以C++类别定义,诞生其对象,透过SM之协助,将该对象参考值传给IServiceManager::addService()函数,就加入到Binder Driver里了。
e、应用程序可透过SM之协助而远距绑定该核心服务,此时SM会回传IBinder接口给应用程序。
f、应用程序可透过IBinder::transact()函数来与核心服务互传数据。
android lifecycle实现原理Android生命周期是指Android应用程序在启动、运行、暂停、停止、销毁等不同的状态下所经历的一系列过程。
充分理解Android 生命周期对于开发高质量、稳定的Android应用程序至关重要。
了解Android生命周期实现的原理,有助于我们更好地掌握Android开发。
1. Activity 生命周期Activity是Android中最基本的组件之一,它是用户交互的主要场所。
Activity生命周期是Android应用程序的核心,它包括启动、暂停、停止、恢复、重新创建和销毁等不同的状态。
具体来说,Activity生命周期分为以下几个步骤:a. onCreate():Activity第一次创建时调用,用来初始化Activity中的各种组件,如布局、数据等。
b. onStart():Activity即将可见时调用,但还没有获取用户的焦点,因此不会接收用户输入。
c. onResume():Activity已经获取了用户焦点,处于onResume 状态,此时用户可以立即输入并与Activity进行交互。
d. onPause():Activity因某种原因而失去了焦点,但是仍然可见。
通常在此处进行一些数据的保存和清理工作。
e. onStop():Activity完全被另一个Activity所覆盖或当用户按下Home键时,Activity会进入此状态,不再可见。
f. onRestart():Activity重新进入可见状态,通常发生在用户按下Back键后重新返回到该Activity时。
g. onDestroy():当Activity被销毁时,该方法被调用。
在此处进行一些善后工作,例如释放资源和取消注册广播等。
2. Service 生命周期Service是一种后台运行的组件,与Activity不同的是,它没有用户界面,只有后台任务。
Service生命周期可以分为以下步骤:a. onCreate():当Service第一次创建时,该方法会被调用。
开始介绍之前,先看一下本例的界面:Android远程Service调用简介:远程Service调用,是Android系统为了提供进程间通信而提供的轻量级实现方式,这种方式采用一种称为远程进程调用技术来实现,英文名全称是Remote Procedure Call,即RPC。
RPC简介:远程进程调用是指在一个进程里,调用另外一个进程里的服务。
Android通过接口定义语言来生成两个进程间的访问代码。
接口定义语言(Android Interface Definition Language,即AIDL)是Android系统的一种接口描述语言,Android编译器可以将AIDL文件编译成一段JA V A代码,生成相对的接口。
下面来详细介绍下如何通过RPC机制来达到远程进程调用的目的和步骤。
第一,我们要先弄清楚这是怎么样的一个流程。
用通俗点语言来说,打个例子:比如公司A提供A服务,并且这种服务是对外开放的,也就是其他公司或者个人都可以通过某种方式来使用这种服务,公司B想要使用A公司的A服务,就以通过公司A编制的一种形式来使用它。
用图来表示就是:公司B通过公司A的某种形式来使用公司A提供的服务A现在,我们可以说,进程B可以通过进程A提供的某种形式来使用进程A的服务A。
这个过程就是RPC。
了解基本概念之后,我们可以开始进行RPC的实现步骤。
下面我们分点来说明实现RPC 的步骤。
第一、创建AIDL文件。
这个文件和普通的JA V A文件差不多,只不过后缀名是.aidl。
这个文件相当于一个接口,里面要声明一些你想对外提供服务的方法,也就是你要对外暴露的方法。
注意,这个文件里,除了JA V A基本类型和String,List,Map和Charquene类型不需要引入相应的包外,其他的都要引入包。
例如我们创建一个IPerson.aidl文件,里面只声明了一个方法display():package com.test.service;interface IPersonaidl {String display();//该接口里面所有的方法都应该是你想对外暴露的}第二、创建完AIDL文件后,刷新项目,会发现在gen目录对应的目录下会生成一个IPerson.java接口文件,打开该文件,会发现你在aidl文件里面定义的display()方法,不过没有实现。
android vpnservice 原理Android的VPN服务(VPNService)是Android提供的一个内置框架,它允许开发者创建自己的VPN连接,实现安全的远程访问和通信。
在本文中,我们将一步一步地解释Android VPN服务的原理。
1. 什么是VPN?VPN(虚拟专用网络)是一种安全的通信方式,它使用加密和认证机制来保护用户的网络连接。
它通过在公共网络上创建加密的隧道,使用户能够安全地访问私人网络。
VPN可以用于保护隐私、绕过地理限制以及远程访问等场景。
2. VPNService类Android的VPNService类是用于实现VPN连接的关键类。
开发者可以继承这个类,并重写一些关键的方法来自定义VPN连接的行为。
首先,我们需要创建一个继承自VPNService的类。
在这个类中,我们需要实现以下几个方法:- onCreate():在这个方法中,我们可以进行一些初始化操作,比如创建网络连接和配置参数。
- onStartCommand():在这个方法中,我们可以处理启动服务的操作,比如建立VPN连接。
- onRevoke():在这个方法中,我们可以处理VPN连接被取消的情况。
- onDestroy():在这个方法中,我们可以进行一些资源释放的操作。
3. VPN连接的建立在VPNService类中,我们需要重写onStartCommand()方法来建立VPN连接。
在这个方法中,我们需要创建一个文件描述符(FileDescriptor)来实际建立VPN 连接。
首先,我们需要创建一个TunnelInterface(隧道接口),通过系统提供的VpnService.Builder类来获取一个ParcelFileDescriptor对象。
然后,我们可以使用这个文件描述符来创建网络连接。
在这个过程中,我们可以设置一些连接参数,比如IP地址、DNS服务器和路由表等。
一旦连接建立成功,我们就可以开始处理输入和输出流的数据,实现加密和解密的功能。
android getsystemservice原理
Android中的getSystemService()是一个非常重要的方法,它用于获取系统服务。
这个方法接收一个字符串参数,表示需要获取的系统服务类型,例如获取WiFi服务可以传入“wifi”字符串,获取震动服务可以传入“vibrator”字符串等等。
这个方法的实现原理是通过一个系统服务管理器(ServiceManager)来实现的。
当应用程序调用getSystemService()方法时,系统会先检查服务是否已经存在,如果存在则直接返回服务对象,否则会通过ServiceManager去创建并返回服务对象。
ServiceManager是Android系统中的一个重要组件,它管理了系统中所有的服务对象。
当一个服务对象被创建时,它会被ServiceManager所管理,并分配一个唯一的ID。
当应用程序需要获取一个系统服务时,就可以通过这个ID来获取服务对象。
除了SystemService类之外,Android还提供了很多其他的系统服务,例如ActivityManager、PackageManager、TelephonyManager 等等。
这些系统服务可以帮助应用程序实现更强大、更完整的功能,让应用程序更加智能、更加便捷。
- 1 -。
android startforegroundservice 用法Android StartForegroundService 用法详解一、概述在Android开发中,我们经常需要开启一个后台服务来完成一些耗时操作,比如下载文件、上传数据等。
而在Android 8.0(API 级别26)及更高版本中,使用startService() 方法来启动服务将会受到限制,为了提供更好的用户体验,谷歌引入了新的方法startForegroundService(),以确保服务在前台运行并在启动服务后的五秒钟内调用startForeground()。
本文将一步一步回答关于startForegroundService 的用法,帮助开发者更好地了解和使用这个方法。
二、使用步骤1. 创建一个服务类首先,我们需要创建一个继承自Service 的服务类,以实现我们想要的功能。
可以按照以下步骤创建一个基本的服务类:javapublic class MyService extends Service {@Overridepublic int onStartCommand(Intent intent, int flags, int startId) { 在此处执行耗时操作return START_STICKY;}@Overridepublic IBinder onBind(Intent intent) {return null;}@Overridepublic void onDestroy() {super.onDestroy();在此处释放资源}}2. 在清单文件中注册服务在清单文件(AndroidManifest.xml)中注册服务,确保应用程序可以使用该服务。
在<application> 标签内添加以下代码:xml<serviceandroid:name=".MyService"android:enabled="true"android:exported="false" />3. 启动服务在需要启动服务的地方,调用startForegroundService() 方法来启动服务。
在Android开发中,Service是一种用于在后台执行长时间运行操作的组件,而不提供用户界面的应用程序组件。
以下是使用Android Service的一些基本用法:1.定义Service类:创建一个继承自Service的类,并重写其中的一些方法来执行所需的操作。
例如,可以在Service中执行网络请求、文件读写等操作。
2.注册Service:在AndroidManifest.xml文件中注册Service,以便系统可以找到并启动它。
例如:php复制代码<service android:name=".MyService" />3.启动Service:在Activity或其他组件中,使用Context的startService()方法来启动Service。
例如:java复制代码Intent intent = new Intent(this, MyService.class);startService(intent);4.绑定Service:如果需要在Service和Activity之间进行通信,可以使用bindService()方法来绑定Service。
通过回调接口,可以在Service和Activity之间传递数据或执行操作。
5.处理生命周期:由于Service在后台运行,不受Activity的生命周期限制,因此需要处理其自身的生命周期。
在Service中重写onStartCommand()或onBind()方法来执行所需的操作,并在不再需要时调用stopSelf()方法来停止Service。
6.通知用户:如果需要在Service执行某些操作时通知用户,可以使用NotificationManager来发送通知。
例如,可以在Service中发送一个通知,告知用户数据已成功下载或上传。
需要注意的是,使用Service需要谨慎处理资源的释放和生命周期的管理,以避免内存泄漏和资源浪费。
1. .xn 提供了很多WebService 远程WEB 服务方案。
其中有一项为手机号码归属地查询。
2. 新建 Android 项目.3. 创建用于请求的 XML 文档:src/mobile.xml1.<!-- 拷贝于其网站文档 -->2.<?xml version="1.0"encoding="utf-8"?>3.<soap:Envelope xmlns:xsi="/2001/XMLSchema-instance"xmlns:xsd="/2001/XMLSchema"xmlns:soap="/soap/envelope/">4.<soap:Body>5.<getMobileCodeInfo xmlns="/">6.<mobileCode>$mobile</mobileCode> <!-- $mobile 为值定义的一个占位符,在程序中读取此 XMl 之后,需要将它替换成用户输入的手机号码 -->7.<userID></userID>8.</getMobileCodeInfo>9.</soap:Body>10.</soap:Envelope>11.4. Service: 接收用户输入的手机号码,远程调用:/WebServices/MobileCodeWS.asmx ,获取手机归属地若响应成功,服务器会返回这样一个 XML 文档:-----------------------<?xml version="1.0" encoding="utf-8"?><soap12:Envelopexmlns:xsi="/2001/XMLSchema-instance"xmlns:xsd="/2001/XMLSchema"xmlns:soap12="/2003/05/soap-envelope"><soap12:Body><getMobileCodeInfoResponse xmlns="/"><getMobileCodeInfoResult>返回的手机号码归属地</getMobileCodeInfoResult></getMobileCodeInfoResponse></soap12:Body></soap12:Envelope>-----------------------1./**2.* 查询手机号码归属地3.*/4.public class MobileService {5.public static String getMobileAddress(String mobile) throws Exception {6.String path ="/WebServices/MobileCodeWS.asmx";7.8.InputStream is =MobileService.class.getClassLoader().getResourceAsStream("mobile.xml");9.byte[] data = StreamTool.readInputStream(is);10.String xmlStr = new String(data);11.12./* 替换掉手机号码的占位符 */13.xmlStr = xmlStr.replaceAll("//$mobile", mobile);14.Log.i("MobileService", xmlStr);15.16.data = xmlStr.getBytes("UTF-8");17.URL url = new URL(path);18.HttpURLConnection conn = (HttpURLConnection) url.openConnection();19.20.// 设置请求参数与请求头21.conn.setReadTimeout(5*1000);22.conn.setRequestMethod("POST");23.conn.setDoOutput(true);24.conn.setRequestProperty("Content-Type", "text/xml; charset=utf-8");25.conn.setRequestProperty("Content-Length", "" + data.length);26.27.// 将数据写往服务器28.OutputStream os = conn.getOutputStream();29.os.write(data);30.os.flush();31.os.close();32.33.if(conn.get) {}34./* 解析服务器返回的信息 */35.is = conn.getInputStream();36.return parseInput(is);37.}38.39./**40.* 从输入流中解析出号码归属地41.*/42.private static String parseInput(InputStream is) throws Exception {43.XmlPullParser parser = Xml.newPullParser();44.parser.setInput(is, "UTF-8");45.int et = parser.getEventType();46.47.while(et != XmlPullParser.END_DOCUMENT) {48.switch(et) {49.case XmlPullParser.START_TAG :50.String tagName = parser.getName();51.if(tagName != null && "getMobileCodeInfoResult".equals(tagName)) {52.return parser.nextText();53.}54.}55.et = parser.next();57.return "";58.}59.}5. Activity1.5. Activity2.public void onCreate(Bundle savedInstanceState) {3.super.onCreate(savedInstanceState);4.setContentView(yout.main);5.6./* 用于输入待查手机号码文本框 */7.mobileText = (EditText) findViewById(R.id.mobile);8./* 用于输出查询结果的标签 */9.resultView = (TextView) findViewById(R.id.result);10./* 确认查询按钮 */11.button = (Button) findViewById(R.id.button);12.13./* 为其绑定点击事件 */14.button.setOnClickListener(new View.OnClickListener() {15.16.@Override17.public void onClick(View v) {18.String mobile = mobileText.getText().toString();19.try {20./* 调用业务方法,获取手机归属地 */21.String result = MobileService.getMobileAddress(mobile);22.resultView.setText(result);23.} catch (Exception e) {24.Toast.makeText(MainActivity.this, R.string.error,Toast.LENGTH_LONG).show();25.Log.e(TAG, e.toString());26.}27.}28.});1.public class StreamTool {2.public static byte[] readInputStream(InputStream is) throws Exception {3.ByteArrayOutputStream bos = new ByteArrayOutputStream();4.5.byte[] buffer = new byte[1024];6.int len;7.8.while((len = is.read(buffer)) != -1 ) {9.bos.write(buffer, 0, len);10.}11.12.is.close();13.bos.close();14.15.return bos.toByteArray();16.}17.}。
Service的基本使⽤⽅法Android中的Service,其意思是“服务”,它是在后台运⾏,不可交互的。
Service⾃⼰不能运⾏,需要通过某⼀个Activity或者其它Context对象来调⽤,如Context.startService()和Context.bindService()两种⽅式启动Service。
如果在Service的onCreate或者onStart⽅法中做⼀些很耗时的动作,最好是启动⼀个新线程来运⾏这个Service,因为,如果Service运⾏在主线程中,会影响到程序的UI操作或者阻塞主线程中的其它事情。
⼀个使⽤Service的典型的例⼦是,⽤户⼀边在⼿机做其他的事情,⼀边听⼿机上的⾳乐。
其中,在后台播放⾳乐就可以使⽤Service来实现。
在这个应⽤中,⾳乐播放这个功能并没有对应的Activity,因为使⽤者会认为在导航到其他屏幕时,⾳乐应该还在播放。
Service的⽣命周期⽅法⽐Activity要少⼀些,只有onCreate、onStart、onDestroy。
有两种⽅式启动⼀个Service,他们对Service⽣命周期的影响是不⼀样的。
1)通过startService启动Service启动的时候会经历⽣成 开始(onCreate onStart)过程,Service停⽌的时候直接进⼊销毁过程(onDestroy)。
⽽如果是调⽤者直接退出⽽没有调⽤stopService,Service会⼀直在后台运⾏。
直到下次调⽤者再启动起来,并明确调⽤stopService。
2)通过bindServic启动通过bindService⽅法启动Service,其只会运⾏onCreate⽅法,如果调⽤这退出了,Service会调⽤onUnbind onDestroyed⽅法。
Service的onCreate⽅法只会被调⽤⼀次。
如果先绑定了,那么启动的时候就直接运⾏Service的onStart⽅法,如果先启动,那么绑定的时候就直接运⾏onBind⽅法。
Android service 实现过程手机应用层 2010-05-08 00:21:08 阅读159 评论0字号:大中小一、Android Service介绍Android的Service分为两种:Android Service和Native Service。
Android Service:又称为Java Service,是实现在框架层(framework)里的Server。
Android Service以Java编写。
Native Service:又称为System Service,是实现在Runtime层里的Server。
以MediaPlayer为例,从下图我们可以得出两种服务的关系:接下来要讨论的Service是Native Service,与应用程序设计上所讨论的Service(android.app.Service)不同。
二、为什么要写底层的核心服务呢?(1)因为底层核心服务是Android框架里最接近Linux/Driver的部分。
为了充分发挥硬件设备的差异化特性,核心服务是让上层Java应用程序来使用Driver/HW Device特色的重要管道。
(2)在开机过程中,就可以启动核心服务(例如汉字输入法服务等),让众多应用程序来共享之。
(3)由于共享,所以能有效降低Java应用程序的大小(Size)。
三、如何实现一个核心服务呢?要点如下:(1)核心服务通常在独立的进程(Process)里执行。
(2)必须提供IBinder接口,让应用程序可以进行跨进程的绑定(Binding)和呼叫。
(3)因为共享,所以必须确保多线裎安全(Thread-safe)。
(4)以C++类别定义,诞生其对象,透过SM之协助,将该对象参考值传给IServiceManager::addService()函数,就加入到Binder Driver里了。
(5)应用程序可透过SM之协助而远距绑定该核心服务,此时SM会回传IBinder接口给应用程序。
(6)应用程序可透过IBinder::transact()函数来与核心服务互传数据。
四、Server实现实践下面以一个小例子来说明具体实现一个Server的步骤。
此实例功能为简单的整数加法(Add)运算,我们将其命名AddService。
Step-1:以C++撰写AddService类别,其完整程序代码为:AddService.h文件:#ifndef ANDROID_GUILH_ADD_SERVICE_H#define ANDROID_GUILH_ADD_SERVICE_H#include <utils.h>#include <utils/RefBase.h>#include <utils/IInterface.h>#include <utils/Parcel.h>namespace android{class AddService : public BBinder{mutable Mutex mLock;int32_t mNextConnId;public:static int instantiate();AddService();virtual ~AddService();virtual status_t onTransact(uint32_t, const Parcel&, Parcel*, uint32_t); };}#endifAddService.cpp文件:#include "AddService.h"#include <utils/IServiceManager.h>#include <utils/IPCThreadState.h>namespace android {static struct sigaction oldact;static pthread_key_t sigbuskey;int AddService::instantiate() {LOGE("AddService instantiate");int r = defaultServiceManager()->addService(String16("guilh.add"), new AddService());LOGE("AddService r = %d\n", r);return r;}AddService::AddService(){ LOGV("AddService created");mNextConnId = 1;pthread_key_create(&sigbuskey, NULL);}AddService::~AddService(){ pthread_key_delete(sigbuskey);LOGV("AddService destroyed");}status_t AddService::onTransact(uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags){ switch(code) {case 0: {pid_t pid = data.readInt32();int num = data.readInt32();num = num + 1000;reply->writeInt32(num);return NO_ERROR;} break;default:return BBinder::onTransact(code, data, reply, flags);}}};Android.mk文件:LOCAL_PATH:= $(call my-dir)include $(CLEAR_VARS)LOCAL_SRC_FILES:= AddService.cpp#LOCAL_C_INCLUDES:= $(JNI_H_INCLUDE)LOCAL_SHARED_LIBRARIES:= libutilsLOCAL_MODULE:= libAddServiceLOCAL_PRELINK_MODULE:= falseinclude $(BUILD_SHARED_LIBRARY)Step-2:以C++撰写一个可独立执行的addserver.cpp程序,它的用途是:诞生一个AddService类别之对象,然后将该对象参考存入Binder Driver里。
其内容为:addserver.cpp文件:#include <sys/types.h>#include <unistd.h>#include <grp.h>#include <utils/IPCThreadState.h>#include <utils/ProcessState.h>#include <utils/IServiceManager.h>#include <utils/Log.h>#include <private/android_filesystem_config.h>#include "../libaddservice/AddService.h"using namespace android;int main(int argc, char** argv){sp<ProcessState> proc(ProcessState::self());sp<IServiceManager> sm = defaultServiceManager();LOGI("ServiceManager: %p", sm.get());AddService::instantiate();ProcessState::self()->startThreadPool();IPCThreadState::self()->joinThreadPool();}Android.mk文件:LOCAL_PATH:= $(call my-dir)include $(CLEAR_VARS)LOCAL_SRC_FILES:= addserver.cppLOCAL_SHARED_LIBRARIES:= libutils libAddServiceLOCAL_MODULE:= addserviceinclude $(BUILD_EXECUTABLE)Step-3:编译上述两个文件分别产出了libAdd.so类别库和addserver可执行程序。
接着将libAdd.so拷贝到Android仿真器的/system/lib/里;也把addserver拷贝到/system/bin/里。
Step-4:执行addserver。
其中的指令:AddServer::instantiate()就执行到AddServer类别的instantiate()函数,其内容为:int AddService::instantiate() {LOGE("AddService instantiate");int r = defaultServiceManager()->addService(String16("guilh.add"), new AddService());LOGE("AddService r = %d\n", r);return r;}其先执行到new AddServer(),就诞生一个AddServer类别之对象;接着,呼叫defaultServiceManager()函数取得SM的IServiceManager接口;再呼叫IServiceManager::addServer()将该对象参考存入Binder Driver里。
Step-5:这样就成功地将AddService服务加入到Binder Driver里了。
现在就可以写个Add类来使用AddService核心服务了。
以C++撰写Add类别,其完整程序代码为:Add.h文件:#ifndef ANDROID _ADD_H#define ANDROID _ADD_Hnamespace android {class Add {public:int setN(int n);private:static const void getAddService();};}; //namespace#endif // ANDROID _ADD_HAdd.cpp文件:#include <utils/IServiceManager.h>#include <utils/IPCThreadState.h>#include "Add.h"namespace android {sp<IBinder> binder;int Add::setN(int n){getAddService();Parcel data, reply;data.writeInt32(getpid());data.writeInt32(n);LOGE("BpAddService::create remote()->transact()\n"); binder->transact(0, data, &reply);int i = reply.readInt32();return i;}const void Add::getAddService(){sp<IServiceManager> sm = defaultServiceManager(); binder = sm->getService(String16("guilh.add"));LOGE("Add::getAddService %p\n",sm.get());if (binder == 0) {LOGW("AddService not published, waiting...");return;}}};Android.mk文件:LOCAL_PATH:= $(call my-dir)include $(CLEAR_VARS)LOCAL_SRC_FILES:=Add.cppLOCAL_SHARED_LIBRARIES := libutils libAddServiceLOCAL_MODULE := libAddLOCAL_PRELINK_MODULE:= falseinclude $(BUILD_SHARED_LIBRARY)Step-6:下面写个JNI Native类别来使用Add类别之对象。