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

今天我总结一下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的总结,也许有偏差或者理解错误的地方,希望高手们多多给我宝贵建议,让我不断进步,谢谢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android,可以使用AIDLAndroid Interface Definition Language)来定义跨进程通信的接口。如果要让Java客户端调用本地实现AIDL服务,可以使用JNI来实现。以下是实现步骤: 1.编写本地服务代码:使用C或C++编写本地服务的代码,并将其编译成本地库,例如.dll文件(Windows平台)或.so文件(Linux平台)。 2.编写AIDL接口:在Android使用AIDL定义接口。你需要编写一个AIDL文件来定义服务的接口。 3.编写Java代码:在Java编写客户端代码,并使用JNI调用本地库。你需要将AIDL接口转换为Java接口,并使用JNI调用本地实现。 4.将本地库加载到Java使用System.loadLibrary()方法将本地库加载到Java。 5.连接到服务:在Java代码连接到AIDL服务。 以下是一个简单的示例代码: C/C++本地服务代码: ```c #include <jni.h> JNIEXPORT jstring JNICALL Java_com_example_MyService_nativeMethod(JNIEnv *env, jobject obj) { return (*env)->NewStringUTF(env, "Hello from native method!"); } ``` AIDL接口: ```aidl interface IMyService { String sayHello(); } ``` Java客户端代码: ```java public class MyService extends Service { // 定义本地方法 private native String nativeMethod(); // 实现AIDL接口 private final IMyService.Stub mBinder = new IMyService.Stub() { @Override public String sayHello() throws RemoteException { return nativeMethod(); // 调用本地方法 } }; @Override public IBinder onBind(Intent intent) { return mBinder; // 返回AIDL接口 } static { System.loadLibrary("mylib"); // 加载本地库 } } ``` 注意:这只是一个简单的示例,实际情况可能更加复杂。你需要仔细阅读JNI和AIDL文档,并且确保你的本地代码和Java代码之间的交互是正确的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值