跨进程通信(AndroidStudio上使用AIDL)

作者: IT魔幻师 | 来源:发表于2017-07-26 14:48 被阅读81次

    一、AIDL原理

    近日项目中需要用到跨进程通信的技术于是想起了极少用的AIDL,发现以前在eclipse使用aidl 的古老方式居然行不通了,瞎几把折腾了一下之后发现,在androidStudio中使用变得更加方便了,不过也有一些小的变动。

    Android接口定义语言

    AIDL (Android interface definition language)

    android系统中所有的进程都有共同的linux内核空间,通过共享的内存进行通信,aidl就是谷歌封装的进程间通信机制

    二、提供远程服务

    创建程序一:提供服务

    • 创建一个ProvideService使用隐式注册(调用此服务就需要一样的action参数)
    <service android:name=".ProvideService">
          <intent-filter>
               <action    android:name="com.hubin.intent.action.FUCK"></action>
          </intent-filter>
    </service>
    
    • 创建IService.aidl文件接口,(AndroidStudio中创建如下图)


    • 在接口中自己定义需要被远程调用的方法
    • ProvideService中创建MyBinder对象继承Iservice.Stub,并实现相应的方法,并在onBind中返回MyBinder对象

    三、调用远程服务

    创建程序二:绑定服务

    • 1.将程序一中整个aidl的包 拷贝到main目录下,重新build

    • 2.创建MyConnection对象实现ServiceConnection接口,使用IService.Stub.asInterface()将IBinder参数转换为IService对象

           private IService mIService;
           class MyConnection implements ServiceConnection {
                @Override
                public void onServiceConnected(ComponentName name, IBinder service) {
                    mIService = IService.Stub.asInterface(service);
                }
        
                @Override
                public void onServiceDisconnected(ComponentName name) {
        
                }
            }
      
    • 3.通过隐式意图绑定服务

          /**
             * 绑定远程服务
             * @param view
             */
           public void bindservice(View view) {
                Intent mIntent = new Intent();
                mIntent.setAction("com.hubin.intent.action.FUCK");
                mIntent.setPackage("com.hubin.aidldemo");//需要指定提供服务的程序包名
                mConn = new MyConnection();
                bindService(mIntent, mConn,BIND_AUTO_CREATE);
        
            }
      
    • 4.使用mIService调用远程方法,会有异常自己捕获

           /**
             * 执行远程方法
             * @param view
             */
            public void mothedStart(View view) {
               mIService.start();
            }

    相关文章

      网友评论

        本文标题:跨进程通信(AndroidStudio上使用AIDL)

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