示例



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. iOS中忽略NSLog打印信息(通过PCH文件中定义DEBUG宏解决)

    iOS中忽略NSLog打印信息 解决办法: 1.新建PrefixHeader_pch文件,在该文件中定义一下宏 //通过DEBUG宏的定义来解决Debug状态下和Release状态下的输出 #ifde ...

  2. Java语言实现简单FTP软件------>FTP软件远程窗口的实现(六)

    1.首先看一下远程窗口的布局效果 2.看一下本地窗口实现的代码框架 3.远程窗口主要实现代码FtpPanel.java package com.oyp.ftp.panel.ftp; import ja ...

  3. cocos2d-x 工程目录结构说明

    下载最新的cocos2d-x,解压完之后呈现出如下的目录结构: cocos2dx:框架核心目录,里面是存放了2dx引擎的核心代码. CocosDenshion:各个平台的音效实现. document: ...

  4. 文成小盆友python-num11-(2) python操作Memcache Redis

    本部分主要内容: python操作memcache python操作redis 一.python 操作 memcache memcache是一套分布式的高速缓存系统,由LiveJournal的Brad ...

  5. 找不到请求的 .Net Framework Data Provider。可能没有安装。

    解决方法: 安装Microsoft SQL Server Compact 4.0. 安装Microsoft SQL Server Compact 4.0之后,程序运行正常. 问题的原因就是程序连接.s ...

  6. 解决VS2013中“This function or variable may be unsafe”的问题

    1.在VS2013中编译代码时出现如上错误信息,下面就介绍下如何解决This function or variable may be unsafe的问题. 2.用VS2013打开出现错误的代码文件 3 ...

  7. tomcat+mysql数据库连接池的操作

    使用tomcat中的context.xml设置连接池 打开文件:Apache Software Foundation\Tomcat 6.0\conf\context.xml <Resource ...

  8. android百度定位

    package com.aihunqin.test; import android.app.Activity; import android.os.Bundle; import android.wid ...

  9. SQL basic

    Function 从例子学习 drop function dbo.getWorkingDateCount; --getWorkingDateCount = functionName CREATE FU ...

  10. COJ 0026 汉诺塔问题

    汉诺塔问题 难度级别:B: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 经典的汉诺塔游戏相信很多同学都会玩的,规则就不用赘述,百科一下就OK ...