android aidl实现跨进程通信

AIDL是通过Binder 实现的进程间通信,默认支持一些数据类型,在使用这些数据类型的时候是不需要导包的,除了这些类型之外的数据类型,在使用之前必须导包,就算目标文件与aidl 文件在同一个包下。

默认支持的数据类型包括: Java中的八种基本数据类型;String 类型;CharSequence类型;定义的parcelable(传递对象时,类要实现pacelable接口,android studio可自动生成);List类型:List中的所有元素必须是AIDL支持的类型之一;Map类型:Map中的所有元素必须是AIDL支持的类型之一。

 Gradle 在构建项目的时候通过 sourceSets 来配置不同文件的访问路径,Gradle 默认是将 java 代码的访问路径设置在 java 包下的,如果 java 文件是放在 aidl 包下的话访问不到,做如下设置:

修改 module的build.gradle 文件,在 android{} 中加上下面的内容:

sourceSets {

    main {

        java.srcDirs = [“src/main/java”, “src/main/aidl”]

    }

}

如此做,我们可以把java文件和aidl文件放到同一包下,创建的aidl文件默认在aidl文件夹下。

示例:A应用从B应用获取一个图书列表

 B应用创建的文件

 

如果要传递对象,创建的类要实现parcelable接口,还要创建与之对应的aidl,做如下声明:

// Book.aidl
package com.hao.www.aidlserver;

parcelable Book;

 

这样才可以在IBookManager.aidl中调用:

// IBookManager.aidl
package com.hao.www.aidlserver;

// Declare any non-default types here with import statements
import com.hao.www.aidlserver.Book;
interface IBookManager {
    List<Book> getBooks();

}

将aidl文件夹复制到A应用:

包名要与B应用一致,然后rebuild重新编译一下,可自动生成对应的java文件,如图:

A应用调用如下:

public class MainActivity extends AppCompatActivity {

    private Button byId;
    private List<Book> books;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        byId = (Button) findViewById(R.id.button);
        byId.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                ComponentName componentName = new ComponentName("com.hao.www.aidlserver", "com.hao.www.aidlserver.RemoteService");
                intent.setComponent(componentName);
                bindService(intent,new MyServiceConnection(), Service.BIND_AUTO_CREATE);
            }
        });

    }
    class MyServiceConnection implements ServiceConnection{

        private static final String TAG = "MyServiceConnection";

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            IBookManager iBookManager = IBookManager.Stub.asInterface(service);
            try {
                books = iBookManager.getBooks();
                StringBuffer sb = new StringBuffer();
                for (int i = 0; i < books.size(); i++) {
                    sb.append(books.get(i).getName()+":"+books.get(i).getPrice()+",");
                }
                Toast.makeText(MainActivity.this,new String(sb),Toast.LENGTH_LONG).show();
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    }

}

示例地址:点击打开链接,导入后分别运行aidlserver module和app module

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值