• 【整理】使用AIDL跨进程传递复杂对象的实践例子


    首先定义对象类,并实现Parcelable接口,实现接口内的几个方法,看代码,Person.java

    package com.example.u3.aidltest;
    
    import android.os.Parcel;
    import android.os.Parcelable;
    
    /**
     * Created by U3 on 2015/3/11.
     */
    public class Person implements Parcelable {
        private String name;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getPass() {
            return pass;
        }
    
        public void setPass(String pass) {
            this.pass = pass;
        }
    
        private String pass;
        @Override
        public int describeContents() {
            return 0;
        }
     
        public static final Creator<Person> CREATOR = new Creator<Person>() {
            @Override
            public Person createFromParcel(Parcel source) {
                return new Person(source);
            }
    
            @Override
            public Person[] newArray(int size) {
                return new Person[size];
            }
        };//用于创建
        public Person()//测试用
        {
            name = "hel";
            pass = "213";
        }
        @Override
        public void writeToParcel(Parcel dest, int flags) {
            dest.writeString(name);
            dest.writeString(pass);
        }
       private Person(Parcel in)//必须与上面的写入顺序相同,否则值会错误
        {
           name = in.readString();
            pass = in.readString();
        }
    
    
    }

    然后,新建两个AIDL文件,一个声明接口一个声明上面的类,声明类的AIDL名字必须与类相同,看代码

    Person.aidl

    package com.example.u3.aidltest;//包名
    parcelable Person;

    myaidl.aidl

    // myaidl.aidl
    package com.example.u3.aidltest;
    
    // Declare any non-default types here with import statements
    import com.example.u3.aidltest.Person;//需要先引入
    interface myaidl {
        /**
         * Demonstrates some basic types that you can use as parameters
         * and return values in AIDL.
         */
        Person getperson(in Person s);
    }

    然后在服务中使用自动生成的类,实现方法,见代码

    package com.example.u3.aidltest;
    
    import android.app.Service;
    import android.content.Intent;
    import android.os.IBinder;
    import android.os.RemoteException;
    import android.util.Log;
    
    /**
     * Created by U3 on 2015/3/11.
     */
    public class Server extends Service {
        class My extends myaidl.Stub {//继承自动生成的类,实现方法
            @Override
            public Person getperson(Person s) throws RemoteException {
    
                Log.v("sk", s.getName()+" "+s.getPass());
                s.setName("hi!!!!");
                return s;
            }
        }
    
        @Override
        public IBinder onBind(Intent intent) {
            return new My();
        }
    }

    然后在客户端,复制AIDL文件所在包和Person以及他的包

    两边的结构图如下

    服务端结构

    客户端结构

    -----人若无名,则可专心练剑
  • 相关阅读:
    如何实现桌面App图标可以动态显示消息数(类似手机上的QQ图标)?
    Quartz.NET开源作业调度框架系列(五):AdoJobStore保存job到数据库
    Quartz.NET开源作业调度框架系列(四):Plugin Job
    Quartz.NET开源作业调度框架系列(三):IJobExecutionContext 参数传递
    Quartz.NET开源作业调度框架系列(二):CronTrigger
    Quartz.NET开源作业调度框架系列(一):快速入门step by step
    如何在Visual Studio中开发自己的代码生成器插件
    C#如何定制Excel界面并实现与数据库交互
    Ajax+PHP+MySQL 登陆示例
    Tomcat性能优化(二) ExpiresFilter设置浏览器缓存
  • 原文地址:https://www.cnblogs.com/u3shadow/p/4332938.html
Copyright © 2020-2023  润新知