android aidl实现2个应用通信

服务端和客户端gradle(app)都要配置

点击查看代码
android {    
buildFeatures {        
        //aidl客户端和服务端都要配置
        aidl=true
    }
}

1.服务端

aidl接口代码如下

点击查看代码
package com.example.myserverpro;
//服务端提供接口 写完一定要记得Sync一下,用于生成IRemoteAidl.Stub()
interface IRemoteAidl {
      int add(int a,int b);
      String getMsg(String str);
}

服务端实现接口,代码如下

点击查看代码
package com.example.myserverpro
import android.app.Service
import android.content.Intent
import android.os.IBinder
class RemoteAidlService: Service() {
    //实现Stub
    val binder=object :IRemoteAidl.Stub(){
        override fun add(a: Int,b: Int): Int {
            return   a+b
        }
        override fun getMsg(str:String): String {
            return   "我是服务段,收到:"+str
        }
    }
    override fun onBind(p0: Intent?): IBinder? {
        return binder
    }

}

下面是服务端的清单文件

点击查看代码
    <application>
        <service
            android:name=".RemoteAidlService"
            android:enabled="true"
            android:exported="true"><!--//允许外部应用绑定-->
            <intent-filter>
                <!--  action自定义的 用于客户端绑定 -->
                <action android:name="com.example.myserverpro.RemoteAidlService"/><!--外部 通过action来绑定 -->
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </service>
    </application>

2.客户端
aidl接口代码如下

点击查看代码
package com.example.myserverpro;
//服务端提供接口 写完一定要记得Sync一下,用于生成IRemoteAidl.Stub()
interface IRemoteAidl {
      int add(int a,int b);
      String getMsg(String str);
}

客户端MainActivity类

点击查看代码
    var remoteAidl: IRemoteAidl?=null
    val con=object : ServiceConnection {
        override fun onServiceConnected(
            p0: ComponentName?,
            p1: IBinder?
        ) {
            //拿到代理
               remoteAidl= IRemoteAidl.Stub.asInterface(p1)
               var value=remoteAidl?.add(1,2)
               var str=remoteAidl?.getMsg("客户端发送")
              Log.v("****","绑定成功   返回值:${value}      ${str}")
        }

        override fun onServiceDisconnected(p0: ComponentName?) {
            remoteAidl= null
            Log.v("****","断开")
        }
    }

    fun bindRemoteService(){
        //action是服务端的注册文件对应action
        val intent= Intent("com.example.myserverpro.RemoteAidlService")
        //服务端的包名
        intent.setPackage("com.example.myserverpro")
        bindService(intent,con,BIND_AUTO_CREATE)
    }
    override fun onCreate(savedInstanceState: Bundle?) {  
         ...
         bindRemoteService()
     }
    override fun onDestroy() {
        super.onDestroy()
        //解绑
        if (remoteAidl!=null){
            unbindService(con)
        }
    }

客户端清单文件 注意安卓 11+的,要加queries标签

点击查看代码
<application> </application>
    <!-- queries 是在  application外的-->
    <queries>
        <!-- 写服务端包名 -->
        <package  android:name="com.example.myserverpro" />
    </queries>

测试流程
1.先运行服务apk,再运行客户端apk,然后看LOG输出。

posted @ 2026-10-22 15:13  xiao250  阅读(1)  评论(0)    收藏  举报