美文网首页
合适自己的AIDL的文章

合适自己的AIDL的文章

作者: 无良安生 | 来源:发表于2021-09-16 16:38 被阅读0次

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

首先是被调用端:

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的文章

      本文链接:https://www.haomeiwen.com/subject/qzmzyktx.html