示例



aidl接口文件

package com.bqt.aidlservice.aidl;
parcelable Person; 

package com.bqt.aidlservice.aidl;
parcelable Salary;  

package com.bqt.aidlservice.aidl;
import com.bqt.aidlservice.aidl.Salary;  
import com.bqt.aidlservice.aidl.Person;
interface IBinderInterface {
     void callMethodInService();
     
     String queryPerson(int num);
    
    //定义一个Person对象作为传入参数。接口中定义方法时,需要制定新参的传递模式,这里是传入,所以前面有一个【in】
    Salary getMsg(in Person owner);  
}

Bean1

package com.bqt.aidlservice.aidl;
import android.os.Parcel;
import android.os.Parcelable;
public class Person implements Parcelable {
    public String name;
    public Person(String name) {
        this.name = name;
    }
    @Override
    public int hashCode() {
        return name.hashCode();
    }
    @Override
    public boolean equals(Object o) {
        if (o instanceof Person) {
            return name.equals(((Person) o).name);
        } else {
            return false;
        }
    }

    @Override
    public int describeContents() { //实现Parcelable必须实现的方法,不知道拿来干嘛的,直接返回0就行了
        return 0;
    }
    @Override
    public void writeToParcel(Parcel dest, int flags) { //把对象所包含的数据写入到parcel中
        dest.writeString(name);//可以write各种类型的数据
    }
    //必须提供一个名为【CREATOR】的static final属性,该属性需要实现android.os.Parcelable.Creator<T>接口
    public static final Parcelable.Creator<Person> CREATOR = new Parcelable.Creator<Person>() {
        @Override
        public Person createFromParcel(Parcel source) {
            return new Person(source.readString());//从Parcel中读取数据,返回Person对象,和构造方法中的参数列表相对应
        }
        @Override
        public Person[] newArray(int size) {
            return new Person[size];
        }
    };
}

Bean2

package com.bqt.aidlservice.aidl;
import android.os.Parcel;
import android.os.Parcelable;
public class Salary implements Parcelable {
    public String type;
    public Integer salary;
    public Salary(String type, Integer salary) {
        this.type = type;
        this.salary = salary;
    }
    public String toString() {
        return "工作:" + type + "    薪水: " + salary;
    }

    @Override
    public int describeContents() {
        return 0;
    }
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(type);
        dest.writeInt(salary);
    }
    public static final Parcelable.Creator<Salary> CREATOR = new Parcelable.Creator<Salary>() {
        //从Parcel中读取数据,返回Person对象
        @Override
        public Salary createFromParcel(Parcel source) {
            return new Salary(source.readString(), source.readInt());
        }
        @Override
        public Salary[] newArray(int size) {
            return new Salary[size];
        }
    };
}

自动生成的Java接口文件

/*
 * This file is auto-generated. DO NOT MODIFY. Original file:
 * D:\\workspace_bqt\\
 * Զ�̷���\\src\\com\\bqt\\aidlservice\\aidl\\IBinderInterface.aidl
 */
package com.bqt.aidlservice.aidl;
public interface IBinderInterface extends android.os.IInterface {
    /** Local-side IPC implementation stub class. */
    public static abstract class Stub extends android.os.Binder implements com.bqt.aidlservice.aidl.IBinderInterface {
        private static final java.lang.String DESCRIPTOR = "com.bqt.aidlservice.aidl.IBinderInterface";
        /** Construct the stub at attach it to the interface. */
        public Stub() {
            this.attachInterface(this, DESCRIPTOR);
        }
        /**
         * Cast an IBinder object into an com.bqt.aidlservice.aidl.IBinderInterface interface,
         * generating a proxy if needed.
         */
        public static com.bqt.aidlservice.aidl.IBinderInterface asInterface(android.os.IBinder obj) {
            if ((obj == null)) {
                return null;
            }
            android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);
            if (((iin != null) && (iin instanceof com.bqt.aidlservice.aidl.IBinderInterface))) {
                return ((com.bqt.aidlservice.aidl.IBinderInterface) iin);
            }
            return new com.bqt.aidlservice.aidl.IBinderInterface.Stub.Proxy(obj);
        }
        @Override
        public android.os.IBinder asBinder() {
            return this;
        }
        @Override
        public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException {
            switch (code) {
            case INTERFACE_TRANSACTION: {
                reply.writeString(DESCRIPTOR);
                return true;
            }
            case TRANSACTION_callMethodInService: {
                data.enforceInterface(DESCRIPTOR);
                this.callMethodInService();
                reply.writeNoException();
                return true;
            }
            case TRANSACTION_queryPerson: {
                data.enforceInterface(DESCRIPTOR);
                int _arg0;
                _arg0 = data.readInt();
                java.lang.String _result = this.queryPerson(_arg0);
                reply.writeNoException();
                reply.writeString(_result);
                return true;
            }
            case TRANSACTION_getMsg: {
                data.enforceInterface(DESCRIPTOR);
                com.bqt.aidlservice.aidl.Person _arg0;
                if ((0 != data.readInt())) {
                    _arg0 = com.bqt.aidlservice.aidl.Person.CREATOR.createFromParcel(data);
                } else {
                    _arg0 = null;
                }
                com.bqt.aidlservice.aidl.Salary _result = this.getMsg(_arg0);
                reply.writeNoException();
                if ((_result != null)) {
                    reply.writeInt(1);
                    _result.writeToParcel(reply, android.os.Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
                } else {
                    reply.writeInt(0);
                }
                return true;
            }
            }
            return super.onTransact(code, data, reply, flags);
        }
        private static class Proxy implements com.bqt.aidlservice.aidl.IBinderInterface {
            private android.os.IBinder mRemote;
            Proxy(android.os.IBinder remote) {
                mRemote = remote;
            }
            @Override
            public android.os.IBinder asBinder() {
                return mRemote;
            }
            public java.lang.String getInterfaceDescriptor() {
                return DESCRIPTOR;
            }
            @Override
            public void callMethodInService() throws android.os.RemoteException {
                android.os.Parcel _data = android.os.Parcel.obtain();
                android.os.Parcel _reply = android.os.Parcel.obtain();
                try {
                    _data.writeInterfaceToken(DESCRIPTOR);
                    mRemote.transact(Stub.TRANSACTION_callMethodInService, _data, _reply, 0);
                    _reply.readException();
                } finally {
                    _reply.recycle();
                    _data.recycle();
                }
            }
            @Override
            public java.lang.String queryPerson(int num) throws android.os.RemoteException {
                android.os.Parcel _data = android.os.Parcel.obtain();
                android.os.Parcel _reply = android.os.Parcel.obtain();
                java.lang.String _result;
                try {
                    _data.writeInterfaceToken(DESCRIPTOR);
                    _data.writeInt(num);
                    mRemote.transact(Stub.TRANSACTION_queryPerson, _data, _reply, 0);
                    _reply.readException();
                    _result = _reply.readString();
                } finally {
                    _reply.recycle();
                    _data.recycle();
                }
                return _result;
            }
            //定义一个Person对象作为传入参数。接口中定义方法时,需要制定新参的传递模式,这里是传入,所以前面有一个【in】
            @Override
            public com.bqt.aidlservice.aidl.Salary getMsg(com.bqt.aidlservice.aidl.Person owner) throws android.os.RemoteException {
                android.os.Parcel _data = android.os.Parcel.obtain();
                android.os.Parcel _reply = android.os.Parcel.obtain();
                com.bqt.aidlservice.aidl.Salary _result;
                try {
                    _data.writeInterfaceToken(DESCRIPTOR);
                    if ((owner != null)) {
                        _data.writeInt(1);
                        owner.writeToParcel(_data, 0);
                    } else {
                        _data.writeInt(0);
                    }
                    mRemote.transact(Stub.TRANSACTION_getMsg, _data, _reply, 0);
                    _reply.readException();
                    if ((0 != _reply.readInt())) {
                        _result = com.bqt.aidlservice.aidl.Salary.CREATOR.createFromParcel(_reply);
                    } else {
                        _result = null;
                    }
                } finally {
                    _reply.recycle();
                    _data.recycle();
                }
                return _result;
            }
        }
        static final int TRANSACTION_callMethodInService = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0);
        static final int TRANSACTION_queryPerson = (android.os.IBinder.FIRST_CALL_TRANSACTION + 1);
        static final int TRANSACTION_getMsg = (android.os.IBinder.FIRST_CALL_TRANSACTION + 2);
    }
    public void callMethodInService() throws android.os.RemoteException;
    public java.lang.String queryPerson(int num) throws android.os.RemoteException;
    //定义一个Person对象作为传入参数。接口中定义方法时,需要制定新参的传递模式,这里是传入,所以前面有一个【in】
    public com.bqt.aidlservice.aidl.Salary getMsg(com.bqt.aidlservice.aidl.Person owner) throws android.os.RemoteException;
}

远程Service

public class MyRemoteService extends Service {
    private String[] names = { "B神", "艹神", "基神", "J神", "翔神" };
    private static Map<Person, Salary> map = new HashMap<Person, Salary>();
    static {
        map.put(new Person("包青天"), new Salary("码农", 20000));
        map.put(new Person("白乾涛"), new Salary("歌手", 1000));
        map.put(new Person("baiqiantao"), new Salary("学生", 50));
        map.put(new Person("bqt"), new Salary("老师", 8000));
    }
    @Override
    public IBinder onBind(Intent intent) {
        Log.i("bqt", "onBind");
        return new MyBinder();
    }

    /**无参无返回值的方法*/
    private void methodInService() {
        Log.i("bqt", "服务里的方法被调用了……");
    }
    /**基本类型有返回值方法*/
    private String query(int num) {
        if (num >= 0 && num < 5) {
            return names[num];
        }
        return "尼玛,只能传0-4";
    }
    /**传递复杂数据*/
    private Salary getPersonSalary(Person person) throws RemoteException {
        Salary salary = map.get(person);//对于Hash系列的集合,是先判断对象的【hashCode】返回值是否相同,再判断对象的【equals】返回值是否为true
        if (salary != null) {
            return salary;
        } else {
            return new Salary("木有工作", 0);
        }
    }

    private class MyBinder extends Stub {//不是由【extends Binder implements IBinderInterface】改为【extends IBinderInterface.Stub】而是改为【extends Stub】
        @Override
        public void callMethodInService() throws RemoteException {
            methodInService();
        }
        @Override
        public String queryPerson(int num) throws RemoteException {
            return query(num);
        }
        @Override
        public Salary getMsg(Person person) throws RemoteException {
            return getPersonSalary(person);
        }
    }
}

清单文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.bqt.aidlservice"
    android:versionCode="1"
    android:versionName="1.0" >
    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="21" />
    <!-- 声明权限 -->
    <permission
        android:name="com.bqt.permission"
        android:protectionLevel="normal" />
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <!-- 指定激活此Service需要的权限 -->
        <service
            android:name=".MyRemoteService"
            android:permission="com.bqt.permission" >
            <intent-filter>
                <action android:name="com.bqt.service.REMOTE_SERVICE" />
            </intent-filter>
        </service>
    </application>
</manifest>

调用者Activity

public class MainActivity extends ListActivity {
    public static final String ACTION_REMOTE_SERVICE = "com.bqt.service.REMOTE_SERVICE";
    private MyServiceConnection conn;
    private IBinderInterface mIBinder;
    public static final String[] personNames = { "包青天", "白乾涛", "baiqiantao", "bqt", "O(∩_∩)O哈哈~" };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        List<String> mData = new ArrayList<String>(Arrays.asList("bindService绑定服务", "unbindService取消绑定服务"//
                , "调用无参无返回值的方法", "调用基本类型有返回值方法", "传递复杂数据"));
        setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mData));
        conn = new MyServiceConnection();
    }
    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        if (position == 0) {
            bindService(new Intent(ACTION_REMOTE_SERVICE), conn, BIND_AUTO_CREATE);
        } else if (position == 1) {
            unbindService(conn);
            mIBinder = null;
        } else {
            if (mIBinder == null) {
                Toast.makeText(this, "还没绑定呦", Toast.LENGTH_SHORT).show();
                return;
            }
            try {
                switch (position) {
                case 2:
                    mIBinder.callMethodInService();
                    break;
                case 3:
                    Toast.makeText(this, "查询结果为:" + mIBinder.queryPerson(new Random().nextInt(6)), Toast.LENGTH_SHORT).show();
                    break;
                case 4:
                    Toast.makeText(this, mIBinder.getMsg(new Person(personNames[new Random().nextInt(5)])).toString(), Toast.LENGTH_SHORT).show();
                    break;
                }
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }
    }
    private class MyServiceConnection implements ServiceConnection {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            mIBinder = IBinderInterface.Stub.asInterface(service);
            Toast.makeText(MainActivity.this, "服务已连接", Toast.LENGTH_SHORT).show();
        }
        @Override
        public void onServiceDisconnected(ComponentName name) {
        }
    }
}

调用者清单文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.bqt.bindremote"
    android:versionCode="1"
    android:versionName="1.0" >
    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="17" />
    <!-- 声明使用指定的权限 -->
    <uses-permission android:name="com.bqt.permission" />
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.bqt.bindremote.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

附件列表

服务 远程服务 AIDL 进程间通讯 IPC 深化的更多相关文章

  1. 服务 远程服务 AIDL 进程间通讯 IPC

    Activity aidl接口文件 package com.bqt.aidlservice;  interface IBinderInterface {     /* 更改文件后缀为[.aidl]去掉 ...

  2. Android AIDL 进行进程间通讯(IPC)

    编写AIDL文件时,需要注意: 1.接口名和aidl文件名相同. 2.接口和方法前不用加访问权限修饰符 (public.private.protected等,也不能用final.static). 3. ...

  3. High Performance Networking in Google Chrome 进程间通讯(IPC) 多进程资源加载

    小结: 1. 小文件存储于一个文件中: 在内部,磁盘缓存(disk cache)实现了它自己的一组数据结构, 它们被存储在一个单独的缓存目录里.其中有索引文件(在浏览器启动时加载到内存中),数据文件( ...

  4. QSharedMemory共享内存实现进程间通讯(IPC)及禁止程序多开

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:QSharedMemory共享内存实现进程间通讯(IPC)及禁止程序多开     本文地址:h ...

  5. 服务 进程间通讯 IPC AIDL Parcelable 简介

    1.IBinder和Binder是什么鬼? 我们来看看官方文档怎么说: 中文翻译:  IBinder是远程对象的基本接口,是为了高性能而设计的轻量级远程调用机制的核心部分. 但他不仅用于远程调用,也用 ...

  6. 进程间通讯IPC的几种方式总结

    Linux进程间的通讯 Unix发展做出重大贡献的两大主力AT&T的贝尔实验室及BSD(加州大学伯克利分校的伯克利软件发布中心)在进程间通信方面的侧重点有所不同.前者对Unix早期的进程间通信 ...

  7. Python-互斥锁 进程间通讯

    3.守护进程(**) 主进程创建守护进程 其一:守护进程会在主进程代码执行结束后就终止 其二:守护进程内无法再开启子进程,否则抛出异常: AssertionError: daemonic proces ...

  8. Android(java)学习笔记232:Android进程间通讯(IPC)之AIDL

    一.IPC inter process communication  进程间通讯 二.AIDL android  interface  defination  language  安卓接口定义语言 满 ...

  9. Android(java)学习笔记175:Android进程间通讯(IPC)之AIDL

    一.IPC inter process communication  进程间通讯 二.AIDL android  interface  defination  language  安卓接口定义语言 满 ...

随机推荐

  1. 你好,C++(27)在一个函数内部调用它自己本身 5.1.5 函数的递归调用

    5.1.5 函数的递归调用 在函数调用中,通常我们都是在一个函数中调用另外一个函数,以此来完成其中的某部分功能.例如,我们在main()主函数中调用PowerSum()函数来计算两个数的平方和,而在P ...

  2. 【结构型】Proxy模式

    代理模式是指为其他对象提供代理来控制对象的访问.这种手段有时候可以给我们带来许多好处.如:通过代理可以实现异步响应处理:通过代理可以起到保护或限制对象的使用的作用,从而提高安全性. 在设计上,用户使用 ...

  3. php批量上传图片并把图片名放入数据库

    前几天工作中要做这样一个功能,有八百多个系统 生成的会员:给这八百多个系统会员上传图片:然后把图片名放入数据库. 第一步: 第一步肯定是首先把图片上传到对应的图片目录下,直接用框架中已经有的上传类: ...

  4. linux下实现ls()函数遍历目录

    转载请注明原创:http://www.cnblogs.com/StartoverX/p/4600794.html 需求:在linux下遍历目录,输出目录中各文件名. 在linux下遍历目录的相关函数有 ...

  5. CFont 字体类

    CFont 字体类 初始化函数 CreateFontIndirect 初始化一个由LOGFONT结构给出其特征的CFont对象 CreateFont 初始化用指定特性定义的CFont对象 Create ...

  6. 利用FbinstTool+大白菜u盘工具,制作多系统启动U盘【转】

    一般制作多系统启动盘的教程都会要用到rub4dos+grubinst+ultraiso+msgdiyerl等等工具,一大串的工具列表让人望而生畏.其实大白菜里已经对这些工具做了非常好的封装,利用大白菜 ...

  7. 关于Bayes网络新解

    经典贝叶斯网络 贝叶斯分类器的分类原理是通过某对象的先验概率,利用贝叶斯公式计算出其后验概率,即该对象属于某一类的概率,选择具有最大后验概率的类作为该对象所属的类.目前研究较多的贝叶斯分类器主要有四种 ...

  8. DOCKER内部安装指南

    本文介绍如何在RedHat/CentOS环境下安装Docker.官方文档要求Linux kernel至少3.8以上,且docker只能运行在64位的系统中.由于RHEL6和CentOS6的内核版本为2 ...

  9. I2C的读写操作实验

    [实验任务]   利用24C08断电以后存储的数据不消失的特点,可以做一个断电保护装置.首先利用单片机做一个0-99秒的自动计时器.然后随机关断电源,在 通电以后计时器接着断电前的状态继续计时. [实 ...

  10. Calling a Web API From a .NET Client (C#)

    on|January 20, 2014 1760 of 2013 people found this helpful Print Download Completed Project This tut ...