美文网首页
合适自己的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