Android Service 的使用(五)----如何实现AIDL文件中含有对象的调用

原创 2015年07月05日 23:00:10

今天我总结一下AIDL文件中含有对象的调用。本人比较笨,用词方面可能不是很准确。要实现AIDL文件中含有对象的调用,要用到Android中的Parcelable这个接口。

下面通过一个具体的实例看看到底如何实现AIDL文件中含有对象的调用。

1. 建立AIDL文件

同样还是建立一个AIDL文件,如下:

package com.android.zinc;

import com.android.zinc.MathFunction;

interface IMyService{
float calculateResult(in MathFunction myMathFunction);
}

这个AIDL文件,仅有一个方法calculateResult,返回一个float类型的结果,但是这个方法中有一个MathFunction的对象,像这样在aidl中有对象的调用就要用到Parcelable(打包器)来处理。

2. 建立对象的类继承Parcelable

这里是建立一个MathFunction这样一个类,代码如下:

public class MathFunction implements Parcelable {

    private int parameter;
    
    public MathFunction() {
        
    }
    public MathFunction(Parcel myParcelable){
        parameter=myParcelable.readInt();
    }
    
    public void setValue(int para){
        parameter = para;
    }
    
    public int getValue(){
        return parameter;
    }
    
    @Override
    public int describeContents() {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override

    //将对象打包到Parcel中
    public void writeToParcel(Parcel dest, int flags) {
        // TODO Auto-generated method stub
        dest.writeInt(parameter);
    }

    public static final Parcelable.Creator<MathFunction> CREATOR = new Parcelable.Creator<MathFunction>() {

        @Override
        public MathFunction createFromParcel(Parcel source) {
            // TODO Auto-generated method stub
            return new MathFunction(source);
        }

        @Override
        public MathFunction[] newArray(int size) {
            // TODO Auto-generated method stub
            return null;
        }
     };  
}

蓝色字体的是必须继承的2个方法,//部分是我对它的理解,仅仅是个人理解,感兴趣的同学可以参考SDK官方文档或者看源代码

红色部分也是必须实现的一个静态对象,官方给出的解释是:Interface that must be implemented and provided as a public CREATOR field that generates instances of your Parcelable class from a Parcel.接口必须被实现,并且提供一个公共的CREATOR域,这个CREATOR域产生一个你的parcelable实例是从parcel类由来的。

翻译的估计不是很准,还是看看官方文档自己理解理解:

参考gen下面自动生成的IMyService.java。

当调用到calculateResult(in MathFunction myMathFunction)方法后,

if ((myMathFunction!=null)) {
_data.writeInt(1);
myMathFunction.writeToParcel(_data, 0);
}

如果myMathFunction对象不为空的时候,就在parcel的当前数据位置写上"1"并且将myMathFunction对象打包到parcel中

当数据传输时,读取parcel当前数据位置是否为0,如果不为0,就调用CREATOR.createFromParcel()方法,代码如下:

if ((0!=data.readInt())) {
_arg0 = com.android.zinc.MathFunction.CREATOR.createFromParcel(data);

}

返回一个MathFunction的一个实例。

3. 再建立一个AIDL文件

名字是MathFunction.aidl,内容如下:

package com.android.zinc;
parcelable MathFunction;

4. 建立Service

public class MyService extends Service {

    private int paraA;
    private int paraB;
    private int paraC;
    private float delta;
    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return mBinder;
    }

    private final IMyService.Stub mBinder = new IMyService.Stub(){

        @Override
        public float calculateResult(MathFunction myMathFunction)
                throws RemoteException {
            // TODO Auto-generated method stub
            myMathFunction.setValue(1);
            paraA=myMathFunction.getValue();
            myMathFunction.setValue(-4);
            paraB=myMathFunction.getValue();
            myMathFunction.setValue(4);
            paraC=myMathFunction.getValue();
            delta=paraB*paraB-4*paraA*paraC;
            return delta;
        }
        
    };
    @Override
    public void onCreate() {
        // TODO Auto-generated method stub
        super.onCreate();
        Log.d("zinc",">>>>>>>>>>service.OnCreate()<<<<<<<<<<");
    }

    @Override
    public void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // TODO Auto-generated method stub
        return super.onStartCommand(intent, flags, startId);
    }    
}

5. 完善客户端的程序

private ServiceConnection connection = new ServiceConnection(){

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            // TODO Auto-generated method stub
            iMyService = (IMyService) IMyService.Stub.asInterface(service);
            if(service!=null){
                try {
                    resultDelta = iMyService.calculateResult(new MathFunction());
                } catch (RemoteException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                if(resultDelta<0){
                    resultTextView.setText("没有实根,仅存在两个虚根");
                }
                else if (resultDelta == 0) {
                    resultTextView.setText("有2个相等的实根:  ");
                }
                else {
                    resultTextView.setText("有2个不相等的实根\n");
                }
            }
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            // TODO Auto-generated method stub
            
        }    
    };

以上5篇文章是我对Android Service的总结,也许有偏差或者理解错误的地方,希望高手们多多给我宝贵建议,让我不断进步,谢谢!

service启动activity同时需要得到activity里的某个对象实现方法

本人android小菜鸟一只,最近因为某一个顽强的大boss bug困扰鄙人2天之久。 其根本问题就是startactivity的启动过程是放在一个ui线程里面执行的。 所以,当我在service...
  • WalterZhoukick
  • WalterZhoukick
  • 2016年03月02日 12:05
  • 902

Android动态部署五:如何从插件apk中启动Service

接下来我们通过分析Service启动流程来看看宿主apk如何启动Android四大组件之Service。...
  • ximsfei
  • ximsfei
  • 2016年04月06日 14:04
  • 3240

android五中方式调用服务service中的方法

今天看到一张图片,上面有句话 —- 没有伞的孩子,要快跑 android五中方式调用服务service中的方法分别是 - 通过重复调用startService 来根据意图Intent传递...
  • z8z87878
  • z8z87878
  • 2016年06月18日 20:27
  • 1701

android 四大组件之Service两种调用方式使用详解

一 概述 Service服务作为android中的四大组件之一,其作用和重要性也不用多说。service用于长期在后台处理任务,与Activity相反Service没有可见的用户界面,但Servic...
  • AirMario
  • AirMario
  • 2016年12月21日 08:39
  • 1346

handler——Service 中的使用示例

转自http://blog.csdn.net/coolszy/article/details/6360577 public class MessageService extends Service ...
  • chuntiandejiaobu10
  • chuntiandejiaobu10
  • 2016年08月25日 17:47
  • 1415

Android -- service 利用广播调用服务的方法

1. 实现原理,在Service里面注册一个广播接收者,
  • xj626852095
  • xj626852095
  • 2014年04月03日 14:59
  • 968

Android开发笔记---service的绑定及如何获得service实例

service的绑定 1.bindService(serviceIntent, this,Context.BIND_AUTO_CREATE );这个函数是用来绑定service的,但是由于监听是这个...
  • liang1232015
  • liang1232015
  • 2015年08月01日 11:50
  • 3442

Android四大组件应用系列——使用BroadcastReceiver和Service实现倒计时

一、问题描述   Service组件可以实现在后台执行一些耗时任务,甚至可以在程序退出的情况下,让Service在后台继续保持运行状态。Service分本地服务和远程服务,Local地服...
  • JerehEdu
  • JerehEdu
  • 2016年02月25日 15:27
  • 695

Activity调用Service的方法

一般来说,Activity调用Service 分为两种:进程内调用和进程间调用。进程内调用时比较常用的一种,在进程内调用中我们常常使用的是bindService来启动Service(关于这种启动方式的...
  • guchuanhang
  • guchuanhang
  • 2015年10月04日 08:27
  • 3112

安卓 Service的OnBind方法

Service代码: /** * Created by dllo on 15/12/24. * 自己写: * 第一步:注册 * 第二步:建立内部类 Binder 为了绑定客户端与服务...
  • tianhe718
  • tianhe718
  • 2016年11月04日 13:28
  • 850
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android Service 的使用(五)----如何实现AIDL文件中含有对象的调用
举报原因:
原因补充:

(最多只允许输入30个字)