Android Service 的使用(三)----远程Service的调用
2012-03-19 17:48
369 查看
有了前面2篇文章的基础,我们介绍最后一种Service的使用,远程绑定Serivce。为什么需要这种远程绑定?因为android每个组件都是运行在自己的进程中,他们之间的数据是独立的,但是在想要在进程中传递一些数据,为了解决进程中的通讯问题:Android采用了一种轻量级的实现方式PRC(Remote Procedure Call)来完成进程之间的通讯,并且Adroid通过接口定义语言AIDL(Android Interface Definition Language)来成生两个进程之间相互访问的代码。下面具体我们用一个数学实例来完成Service的远程绑定,我们计算a*X^2+b*X+c=0有几个实根,在Activity中我们把a,b,c三个值传给服务,由Service计算好是否存在实根的情况再返回给Activity,最终得出函数值。
第一步:建立一个AIDL文件
用Eclipse右键点击你的包名,"New"->"File",FileName中填上AIDL文件的名字,这里我起的名字的是IMyService,AIDL文件的内容如下:
package com.android.zinc;
interface IMyService {
int setValue(int para);
int getValue();
float calculateResult(int formulaA, int formulaB, int formulaC);
}
这里需要注意的是:
1. 必须导入除了基本类型外的其他类型,即使他们在同一个包内。不过本例中不存在其他类型。
2. 接口和方法前不用加访问权限修饰符public,private,protected等,也不能用final,static
如果你建立上述AIDL文件后,会自动在gen目录下创建一个java的实现接口。不过是这个接口是自动生成,这里就不去关心了,概念上我们只要知道有这么一回事。
第二步:具体实现AIDL文件接口的功能
定义一个实现类(IMySeviceImpl)类继承Stub类,具体实现AIDL文件接口的三个方法
public class IMyServiceImpl extends IMyService.Stub {
private int functionParameters;
private float functionResult;
@Override
public int setValue(int para) throws RemoteException {
// TODO Auto-generated method stub
return functionParameters = para;
}
@Override
public int getValue() throws RemoteException {
// TODO Auto-generated method stub
return functionParameters;
}
@Override
public float calculateResult(int formulaA, int formulaB, int formulaC ) throws RemoteException {
// TODO Auto-generated method stub
float tmpResult = formulaB*formulaB-4*formulaA*formulaC;
functionResult= (tmpResult >=0) ? tmpResult:-1;
return functionResult;
}
tmpResult是计算数学公式中B^2-4ac是否大于等于0,如果小于0则没有实根。
第三步:将接口暴露给客户端
public class MyRemoteService extends Service {
private IBinder iMyService = new IMyServiceImpl();
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return iMyService;
}
第四步:客户端的调用
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
int a = 0;
int b = 0;
int c = 0;
iMyService = IMyService.Stub.asInterface(service);
if(iMyService!=null){
try {
iMyService.setValue(1);
a = iMyService.getValue();
iMyService.setValue(-4);
b = iMyService.getValue();
iMyService.setValue(5);
c = iMyService.getValue();
delta=iMyService.calculateResult(a, b, c);
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(delta<0){
resultTextView.setText("没有实根,仅存在两个虚根");
}
else if (delta == 0) {
resultRoot1 = -b/2/a;
resultTextView.setText("有2个相等的实根: "+resultRoot1);
}
else {
resultRoot1 = (-b+Math.sqrt(delta))/2/a;
resultRoot2 = (-b-Math.sqrt(delta))/2/a;
resultTextView.setText("有2个不相等的实根\n"+"一个根为: "+ resultRoot1+"\n另一个根为: "+resultRoot2);
}
}
};
第一步:建立一个AIDL文件
用Eclipse右键点击你的包名,"New"->"File",FileName中填上AIDL文件的名字,这里我起的名字的是IMyService,AIDL文件的内容如下:
package com.android.zinc;
interface IMyService {
int setValue(int para);
int getValue();
float calculateResult(int formulaA, int formulaB, int formulaC);
}
这里需要注意的是:
1. 必须导入除了基本类型外的其他类型,即使他们在同一个包内。不过本例中不存在其他类型。
2. 接口和方法前不用加访问权限修饰符public,private,protected等,也不能用final,static
如果你建立上述AIDL文件后,会自动在gen目录下创建一个java的实现接口。不过是这个接口是自动生成,这里就不去关心了,概念上我们只要知道有这么一回事。
第二步:具体实现AIDL文件接口的功能
定义一个实现类(IMySeviceImpl)类继承Stub类,具体实现AIDL文件接口的三个方法
public class IMyServiceImpl extends IMyService.Stub {
private int functionParameters;
private float functionResult;
@Override
public int setValue(int para) throws RemoteException {
// TODO Auto-generated method stub
return functionParameters = para;
}
@Override
public int getValue() throws RemoteException {
// TODO Auto-generated method stub
return functionParameters;
}
@Override
public float calculateResult(int formulaA, int formulaB, int formulaC ) throws RemoteException {
// TODO Auto-generated method stub
float tmpResult = formulaB*formulaB-4*formulaA*formulaC;
functionResult= (tmpResult >=0) ? tmpResult:-1;
return functionResult;
}
tmpResult是计算数学公式中B^2-4ac是否大于等于0,如果小于0则没有实根。
第三步:将接口暴露给客户端
public class MyRemoteService extends Service {
private IBinder iMyService = new IMyServiceImpl();
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return iMyService;
}
第四步:客户端的调用
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
int a = 0;
int b = 0;
int c = 0;
iMyService = IMyService.Stub.asInterface(service);
if(iMyService!=null){
try {
iMyService.setValue(1);
a = iMyService.getValue();
iMyService.setValue(-4);
b = iMyService.getValue();
iMyService.setValue(5);
c = iMyService.getValue();
delta=iMyService.calculateResult(a, b, c);
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(delta<0){
resultTextView.setText("没有实根,仅存在两个虚根");
}
else if (delta == 0) {
resultRoot1 = -b/2/a;
resultTextView.setText("有2个相等的实根: "+resultRoot1);
}
else {
resultRoot1 = (-b+Math.sqrt(delta))/2/a;
resultRoot2 = (-b-Math.sqrt(delta))/2/a;
resultTextView.setText("有2个不相等的实根\n"+"一个根为: "+ resultRoot1+"\n另一个根为: "+resultRoot2);
}
}
};
相关文章推荐
- Android中不使用AIDL实现Service的远程调用
- Android中不使用AIDL实现Service的远程调用
- android 中activity调用远程service中的方法之 aidl的使用
- Android AIDL和远程Service调用示例代码
- Android Service 的使用(四)----进程间的Service的调用
- Android学习之远程绑定调用service
- Android中关于远程Service的使用,也就是夸应用的Service是如何使用的
- 一个简单的demo学习Android远程Service(AIDL的使用
- Android Service AIDL 远程调用服务之简单音乐播放实例【转载】
- 简单音乐播放实例的实现,Android Service AIDL 远程调用服务
- Android Service AIDL 远程调用服务之简单音乐播放实例
- 调用android非unbind的服务中的方法(不使用bindService启动的服务)
- android调用远程service(一个apk调用另一个apk的service)
- Android开发学习笔记:Service的远程调用
- Android程序使用SOAP调用远程WebService服务
- Android中使用AIDL调用远程服务
- 在Android上使用Flamingo进行远程调用的实例
- Android开发学习笔记:Service的远程调用
- Android应用程序四大组件之使用AIDL如何实现跨进程调用Service
- 一个简单的demo学习Android远程Service(AIDL的使用)