Android Service 的使用(三)----远程Service的调用

有了前面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);
            }
        }
    };

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值