Android AIDL简单分析

前言

AIDL是Android SDK提供的使用进程通信的机制。最常用的就是Service的进程通信了,这篇博客主要分析使用AIDL时,SDK生成的帮助完成进程通信的java文件。

AIDL简单使用

关于AIDL的使用,网上有很多很详细、完善的例子,这里就不多赘述了。直接上代码
首先,写一个aidl文件

IRemoteService.aidl
package com.example.aidldemo;

interface IRemoteService {

    void addBook(String book);
    List<String> getBook();
}

然后SDK就会生成下面这个同名java类,也是能够进程通信的关键

IRemoteService.java
package com.example.aidldemo;
public interface IRemoteService extends android.os.IInterface {
   
    ·······
}

接着是写一个Service

public class RemoteService extends Service {
   

    private List<String> mBookList = new ArrayList<String>();

    //创建一个Binder对象,也就是IRemoteService.Stub,
    //并实现IRemoteService的方法
    private IRemoteService.Stub mRemoteService = new IRemoteService.Stub() {
        @Override
        public void addBook(String book) throws RemoteException {
            mBookList.add(book);
        }

        @Override
        public List<String> getBook() throws RemoteException {
            return mBookList;
        }
    };

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return mRemoteService;
    }
}

因为要使用进程通信,当然要让RemoteService运行在不同线程了

在AndroidManifest文件中注册为远程Service
<service android:name=".RemoteService"
            android:process=":aidl"/>

然后在Activity中启动RemoteService

private ServiceConnection mServiceConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            Log.e("aidl", "service connected");
            mTextView.setText("service connect!");
            //获得远程Service的代理
            mBookManager = IRemoteService.Stub.asInterface(service);
            if (mBookManager != null) {
                try {
                    //调用远程Service
                    mBooks = mBookManager.getBook();
                    Log.e(getLocalClassName(), mBooks.toString());
                } catch (RemoteException e) {
                    e.printStackTrace();
                }
            }
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            Log.e("aidl", "service disconnected");

        }
    };

最后就可以直接使用了,效果如下
这里写图片描述

AIDL分析

前面我们先写了一个aidl文件,里面定义了一个我们想要的接口,SDK根据这个文件生成同名的java文件,在这个java文件内实现进程通信的相关内容。这个java文件就是这篇博客的主角。

现在进入正题,分析这个SDK生成java文件,看看它是如何完成进程通信的。

package
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值