AIDL的实现总结
由于应用程序之间不能共享内存。在不同应用程序之间交互数据(跨进程通讯),故使用AIDL的方式。比如天气预报的实现,数据在的刷新可以通过常驻的服务,另一个应用每次绑定服务的时候调用bingservice获取数据(通过打印日志可以发现onstartConand方法会得到调用,发送数据的地方可以写在这里)注意:服务运行在主线程中,普通的服务需要在执行耗时任务的时候需要开启一个线程,防止出现oom。而对于AIDL这种比较特殊,不需要开启一个线程,使用了远程Service后,MyService已经在另外一个进程当中运行了,所以只会阻塞该进程中的主线程,并不会影响到当前的应用程序(此说明可查看郭神的文章:https://blog.csdn.net/guolin_blog/article/details/9797169)。
实现绑定服务的两种方式:startService和bingService两种方式
对于startService方法特点;一旦服务开启跟调用者(开启者)就没有任何关系了。
开启者退出了,开启者挂了,服务还在后台长期的运行。
开启者不能调用服务里面的方法
对于bingService特点:bind的方式开启服务,绑定服务,调用者挂了,服务也会跟着挂掉。
绑定者可以调用服务里面的方法
bindService基本实现:
1.创建一个服务类继承service
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方式的实现(实质是还是通过Bing对象和服务的关联)
1. New —-AIDL—-AIDL File ,建立AIDL文件 (建议aidl下面的包名和java下面的包名一致,考虑到以后传递实体数据这里有个坑)
2. 如果aidl文件正确,Build–Rebulild Project之后,会在build线面的generated包下面自动生成一个Java接口文件
3. 建立一个服务类(Service子类)
4. 实现有aidl文件生成的java接口
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>
对于传递实体的坑
实体类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
下一篇: MVP模式的认识
推荐阅读
-
AIDL的实现总结
-
剑指offer面试题17:打印1到最大的n位数(Java 实现)
-
InferSent的代码实现
-
《递归求阶乘和》要求实现一个计算非负整数阶乘的简单函数,并利用该函数求 1!+2!+3!+...+n! 的值。
-
C# 实现M-N之间随机取K个不重复的数
-
java数据结构----图的遍历应用举例:编程实现判断一个有向图中任意给定的两个顶点之间是否存在一条长度为k的简单路径
-
找出数组中第k大的数(时间复杂度分析、C++代码实现). TopK in array. ( leetcode - 215 )
-
java实现找到数组中不重复的且最大的数
-
n个整数的无序数组,找到每个元素后面比他大的第一个元素(用栈实现)
-
JS实现M*N的不重复组合