AIDL跨进程通信

350 阅读1分钟

1.service端

1.main路径下新建aidl Directory。新建aidl文件

DNAidl.aidl

package com.fengzhisoft.demo1;
import com.fengzhisoft.demo1.Person;

// Declare any non-default types here with import statements

interface DNAidl {
   void addPerson(in Person person);
   List<Person> getPersonList();
}

Person.aidl

package com.fengzhisoft.demo1;

// Declare any non-default types here with import statements

parcelable Person;

2.java路径下添加DNAidlService,Person

DNAidlService

package com.fengzhisoft.demo1

import android.app.Service
import android.content.Intent
import android.os.IBinder

class DNAidlService : Service() {
   private val personarraylist = mutableListOf<Person?>()
   override fun onBind(intent: Intent?): IBinder? {
       return iBinder
   }

   private val iBinder = object : DNAidl.Stub() {
       override fun addPerson(person: Person?) {
           personarraylist.plusAssign(person)
       }

       override fun getPersonList(): MutableList<Person?> {
           return personarraylist
       }

   }
}
 <service
            android:name=".DNAidlService"
            android:exported="true" />

Person

import android.os.Parcel
import android.os.Parcelable

data class Person(
    var name: String?,
    var gradle: Int
) : Parcelable {
    constructor(parcel: Parcel) : this(
        parcel.readString(),
        parcel.readInt()
    ) {
    }

    override fun writeToParcel(parcel: Parcel, flags: Int) {
        parcel.writeString(name)
        parcel.writeInt(gradle)
    }

    override fun describeContents(): Int {
        return 0
    }

    companion object CREATOR : Parcelable.Creator<Person> {
        override fun createFromParcel(parcel: Parcel): Person {
            return Person(parcel)
        }

        override fun newArray(size: Int): Array<Person?> {
            return arrayOfNulls(size)
        }
    }
}

3.服务端app,MainActivity onCreate中启动service

startService(Intent(this, DNAidlService::class.java))

2.Client端

将服务端app的aidl文件夹粘贴至client端app的main路径下

client新建包名例如"demo1"。对应服务端包名。

服务端app的Person.java粘贴至client端app的"demo1"路径下

client端绑定服务

class MainActivity : AppCompatActivity() {
    private var dnaidl: DNAidl? = null
    private val conn by lazy {
        object : ServiceConnection {
            override fun onServiceDisconnected(name: ComponentName?) {

            }

            override fun onServiceConnected(name: ComponentName?, service: IBinder?) {
                dnaidl = DNAidl.Stub.asInterface(service)
            }
        }
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        intent.component =
            ComponentName("com.fengzhisoft.demo1", "com.fengzhisoft.demo1.DNAidlService")
        bindService(intent, conn, Context.BIND_AUTO_CREATE)

        button.setOnClickListener {
            dnaidl?.addPerson(Person("dn", 10))
            dnaidl?.addPerson(Person("dn", 12))
            val people = dnaidl?.personList
            Toast.makeText(this, people.toString(), Toast.LENGTH_SHORT).show()
        }
    }
}