您的位置:首页 > 移动开发 > Android开发

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);

            }

        }

    };
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息