进程通信相当于就是自己的app和别的应用通信,有四种方式,正好对应了四大组件Activity,Broadcast,ContentProvider,和Service。利用service通信也叫AIDL.
Activity 我们直接用intent就可以实现通信,比如我们调用打电话发短信。只不过intent里面传的不是类名而是action
Broadcast 我们可以发广播让别的应用接受,这个也很简单。一般用于自家的app通信
ContentProvider 我们也经常用到,比如获取联系人或者相册图片
Service 利用service通信,我们平时叫AIDL,如果我们的App_A要和另一款App_B交互,我们称A为客户端,B为服务端。
服务端 我们应该先在服务端main下创建aidl的文件夹,然后创建aidl文件,它的写法其实就是一个接口,然后我们在写一个servicele类,在onbind的方法中返回继承aidl接口.stub的内部类。要在清单清单文件注册下service,这样服务端就完成了了。
客户端 把服务端的aidl文件夹拷到客户端下,然后在activity中绑定服务,在5.0以上要用显式绑定,服务端aidl文件的包名和service的包名加类名,绑定的方法中我们还要传入serviceconnection接口实现类,在这个实现类中我们就可以获取aidl接口的实现类,就可以获取到服务端的数据
如果我们要接受对象,我们需要对象序列化,实现parcelable接口。用法和String是一样的,特别要注意的是 将对象考过去的时候,要保证包名跟服务端的一样
通信的媒介其实就是我们继承的aidl接口.stub生成的Ibinder
我们还可以使用messager 实现通信,不用谢aidl,还能实现双向通信。也需要绑定服务,serviceconnection
使用AIDL遇到的问题,
1、5.0以上使用隐式绑定会报错Service Intent must be explicit
2、清单文件注册service,如果没有加intent-filter,serviceconnection会不响应
3、绑定后立马会调用也会造成serviceconnection会不响应,报空指针,