# rsdemo **Repository Path**: chanchaw/rsdemo ## Basic Information - **Project Name**: rsdemo - **Description**: Android AIDL 远程的制作与调用演示 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2019-10-04 - **Last Updated**: 2022-07-08 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README #### 项目介绍 - 创建时间:2019年10月4日16:30:09 - 实现功能:``Android`` 远程服务的制作与测试运行,AIDL服务。 - 开发环境介绍:``Android API = 29`` 即 ``Android 10``,开发IDE是 ``Android Studio`` #### 吐槽 网上搜了N多文章,要么年代久远,要么开发IDE不同操作不懂(小白搞不懂。。),本文以最详细的步骤实现最简的 AIDL 远程服务的制作和调用。 #### 实现步骤 - 概述 在 ``Android Studio`` 中创建了空的工程(其实后来没用到,不过为了配合源码还是要说下),创建模块 ``rsserver`` - 由于 ``Android Studio`` 和 ``IDEA`` 一个德行的,这里只能叫它模块了 - 英文名是 ``module`` 吗。本模块用来制作一个服务可以在本模块的 ``activity`` 中调用,可以提供给其他 ``app`` 或者模块使用,再创建一个客户端模块 ``rsclient`` - 这里的 ``rs`` 表示 ``remote service`` 。那么最终形成的结构如下图: ![](https://user-images.githubusercontent.com/29369287/66197779-ad331100-e6cd-11e9-8e8b-a6ec5edbab83.png) 后面的步骤为先制作服务端模块中的服务并且测试通过后再制作客户端模块,让我们开始吧。 - 制作 ``AIDL`` 接口文件,在服务端模块的根节点上通过右键菜单创建一个``AIDL`` 文件 ![](https://user-images.githubusercontent.com/29369287/66197778-ad331100-e6cd-11e9-8fc2-14998c7a14c2.png) 将其命名为 ``IProcessInfo``,其中只要定义一个方法不用实现,全部代码如下(创建完毕后会有一个默认的方法,将其删除掉,然后追加一个我们自己的方法) ```java // IProcessInfo.aidl package com.ccsoft.rsserver; // Declare any non-default types here with import statements interface IProcessInfo { int getProcessId(); } ``` 保存后 ``AS`` 会自动创建同名的接口文件,之后创建服务的时候要用到 ![](https://user-images.githubusercontent.com/29369287/66197777-ac9a7a80-e6cd-11e9-98a7-81b9f8783cc7.png) - 实现 ``AIDL`` 文件中定义的方法 在项目包 ``com.ccsoft.rsserver`` 下创建包 ``service`` 再在其下创建服务 ``IProcessInfoImpl`` 继承自 ``IProcessInfo.Stub``,其全部代码如下 ```java package com.ccsoft.rsserver.service; import android.os.RemoteException; import com.ccsoft.rsserver.IProcessInfo; public class IProcessInfoImpl extends IProcessInfo.Stub { @Override public int getProcessId() throws RemoteException { return android.os.Process.myPid(); } } ``` 调用本方法会打印进程ID,最终形成的结构如下图 ![](https://user-images.githubusercontent.com/29369287/66197776-ac9a7a80-e6cd-11e9-8b35-0f6514e67471.png) - 创建服务,用来返回实现接口的类的实例,其全部代码如下: ```java package com.ccsoft.rsserver.service; import android.app.Service; import android.content.Intent; import android.os.IBinder; import android.util.Log; import androidx.annotation.Nullable; public class MyRemoteService extends Service { private static final String TAG = "chanchaw"; IProcessInfoImpl mProcessInfo = new IProcessInfoImpl(); @Nullable @Override public IBinder onBind(Intent intent) { Log.e(TAG, "MyRemoteService thread id = " + Thread.currentThread().getId()); return mProcessInfo; } } ``` 最终实现的结构如下 ![](https://user-images.githubusercontent.com/29369287/66197775-ac9a7a80-e6cd-11e9-9e2c-0766685ebc5a.png) - 接下来为服务端创建一个 ``Activity`` 用来测试服务是否可用,先创建布局文件 ``activity_main``,其全部代码如下: ```xml