欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

AIDL的实现总结

程序员文章站 2024-03-15 19:24:48
...

由于应用程序之间不能共享内存。在不同应用程序之间交互数据(跨进程通讯),故使用AIDL的方式。比如天气预报的实现,数据在的刷新可以通过常驻的服务,另一个应用每次绑定服务的时候调用bingservice获取数据(通过打印日志可以发现onstartConand方法会得到调用,发送数据的地方可以写在这里)注意:服务运行在主线程中,普通的服务需要在执行耗时任务的时候需要开启一个线程,防止出现oom。而对于AIDL这种比较特殊,不需要开启一个线程,使用了远程Service后,MyService已经在另外一个进程当中运行了,所以只会阻塞该进程中的主线程,并不会影响到当前的应用程序(此说明可查看郭神的文章:https://blog.csdn.net/guolin_blog/article/details/9797169)。

实现绑定服务的两种方式:startService和bingService两种方式

对于startService方法特点;一旦服务开启跟调用者(开启者)就没有任何关系了。
开启者退出了,开启者挂了,服务还在后台长期的运行。
开启者不能调用服务里面的方法

对于bingService特点:bind的方式开启服务,绑定服务,调用者挂了,服务也会跟着挂掉。
绑定者可以调用服务里面的方法

bindService基本实现:

1.创建一个服务类继承service

AIDL的实现总结

2.重写service的方法,对于onBing方法返回一个bind对象,此对象是建立和服务的链接,故需要通过内部类的方式创建一个MyBing类继承Bing,并在里面定义自己想要实现的方法功能

class MyBing extends Binder{
  //此方法根据需求自己定义实现
    public void getName(){

    }
}

3.获取Bind对象,然后返回给service的onBing重写方法里面

MyBing bing = new MyBing();

@Override
public IBinder onBind(Intent intent) {

    Log.d(TAG, "onBind: ");
    return bing;
}

4.获取bind对象的链接

AIDL的实现总结

对于复杂的AIDL方式的实现(实质是还是通过Bing对象和服务的关联)

1. New —-AIDL—-AIDL File ,建立AIDL文件 (建议aidl下面的包名和java下面的包名一致,考虑到以后传递实体数据这里有个坑

AIDL的实现总结
2. 如果aidl文件正确,Build–Rebulild Project之后,会在build线面的generated包下面自动生成一个Java接口文件

AIDL的实现总结

3. 建立一个服务类(Service子类) 

AIDL的实现总结
4. 实现有aidl文件生成的java接口 

AIDL的实现总结
5. 在AndroidManifest.xml中配置AIDL服务,尤其要注意的是,action标签中android:name的属性值就是客户端要引用该服务的id,也就是Intent类构造方法的参数值。

   <service
            android:name=".activity.service.aidl.AIDLService"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="com.turing.base.activity.service.aidl.AIDLService" />
            </intent-filter>
        </service>

对于传递实体的坑

AIDL的实现总结

实体类user的包名和Userail的包名还有IMsg.aidl的import的包保持一致,否则会报错。

感谢以下博主: https://blog.csdn.net/qq_36988978/article/details/77920926

https://blog.csdn.net/qq_36988978/article/details/77920926

https://blog.csdn.net/yangshangwei/article/details/50675584