合适自己的AIDL的文章

其实就是创建一个服务给别人用而已 写完发现就是这么回事

首先是被调用端:

1、创建AIDL文件 new >> AIDL >> ..
864dfe7c764bf0a9b29f7044a797a16.png
就这样main下的aidl文件
2、然后生成的文件:
package com.cxz.aidlapp;

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

interface IMyAidlInterface {
    /**
     * Demonstrates some basic types that you can use as parameters
     * and return values in AIDL.
     */
    void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,
            double aDouble, String aString);


   String getName();
}
3、注意其中的一些东西

basicTypes这个是告诉你能直接用什么类型 然后 你自定义的就实现 序列化P..

String getName();是自己定义的一个方法,用来调用的

4、然后在定义个Service,直接上代码:
package com.cxz.aidlapp

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

/**
 * @author caoxiazei
 *文件说明:
 *
 */
class AIDLService : Service() {
    override fun onBind(intent: Intent?): IBinder? {
        return MyBinder()
    }

    internal class MyBinder: IMyAidlInterface.Stub() {
        override fun getName(): String {
            return "this is a test app"
        }

    }
}

看到没,就是用binder 去弄的
然后记得注册一下服务,然后定义action

看看调用端

首先先把aidl包拷贝到这边,也是放在main下,而且不用修改一句代码
然后在activity注册那边的服务,并写个调用getname的点击,代码:
class MainActivity : AppCompatActivity() {
    val binding: ActivityMainBinding by lazy { ActivityMainBinding.inflate(layoutInflater) }
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(binding.root)
        binding.tvMore.setOnClickListener {

            try {
                Toast.makeText(baseContext, mIMyAidlInterface?.getName(), Toast.LENGTH_SHORT)
                    .show();
            } catch (e: Exception) {
                Log.e("CXZ_LOG", "------------------->>>>> ${e.message}")
            }

        }

        val intentService = Intent()
        intentService.setAction("action.service.AIDLService")
        intentService.setPackage("com.cxz.aidlapp")
        bindService(intentService, object : ServiceConnection {
            override fun onServiceConnected(name: ComponentName, service: IBinder) {
                mIMyAidlInterface = IMyAidlInterface.Stub.asInterface(service)
            }

            override fun onServiceDisconnected(name: ComponentName) {}
        }, BIND_AUTO_CREATE)
    }

    var mIMyAidlInterface: IMyAidlInterface? = null

}
记得加上setPackage也就是Service所在的app的包名

好了,就到这,简单例子搞定

其实就是创建一个服务给别人用而已 写完发现就是这么回事

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 上一个项目(下载中心)使用到了AIDL相关的技术,趁现在项目不是特别忙,总结一下。 首先第一个问题,AIDL是个什...
    Jdqm阅读 2,868评论 4 11
  • AIDL是什么? AIDL(Android Interface Define Language ——Android...
    安仔夏天勤奋阅读 1,472评论 0 1
  • 什么是AIDL? AIDL:它是一种android内部进程通信接口的描述语言,通过它我们可以定义进程间的通信接口。...
    郑在学_blog阅读 652评论 0 1
  • AIDL Android使用AIDL来实现进程间的通讯; 最简单的进程,两个APP(APP1(app_server...
    杰奎琳子阅读 603评论 0 13
  • 16宿命:用概率思维提高你的胜算 以前的我是风险厌恶者,不喜欢去冒险,但是人生放弃了冒险,也就放弃了无数的可能。 ...
    yichen大刀阅读 6,108评论 0 4