进程间通信
同一个apk文件安装的app下的所有部件(大概)都是同一个进程的。所以这里讲的进程间通信,指的是不同app之间的通信。
实际上,我觉得,如果不同的app通信,用intent,broadcastReceiver就可以了,不过既然有通信的方法,研究一下也无妨。
网络上的例子,包括官网的例子里面,会用到Service部件。这个部件有一点要指出的是:
Service和同app的其他部件是在同一个进程下的,甚至service都没有单独的线程,是和绑定它或者startService()调用者在同一进程的。所以,如果需要进行耗时任务,需要单独的开一个线程在里面。
IntentService类扩展了基础的Service类,并且实现了单独的线程,可以用来执行单次的后台任务,比如下载什么的。
这里说的跨进程,是调用其它app的service,并且互相通信。一般情况下,使用intent只能是开启其他的activity,或者发一个广播,让目标收到。跨进程通信(我更愿意说成app间通信)是不需要频繁的发intent,就可以让两个部件通信。
在service的官方指南中提到过,启动一个service可以用startService()或者bindService(),各自有不同的表现。bindService()叫做 创建绑定服务。
在创建绑定服务的时候,可以用到三个方法,
一,使用Binder类。实现同app的绑定服务。也就是同进程的。
二,使用Messenger类,可以实现跨APP的通信。
三,使用AIDL语言创建通信。实际上Messenger类的内核也用到了AIDL语言,相当于是一种便利类。
使用Binder类的时候,可以直接在同app的其他组件里,直接获得service的实例,直接调用里面的方法。
而使用messenger类的时候,因为是不同的app(当然,同app也可以),所以不能直接获得service实例。而是像普通的intent功能一样,通过隐式的intent来启动其他app的组件,然后,从里面创建一个针对目标service的messenger,通信的时候就往这个messenger里面发信息。(因为非同进程,所以不能直接调用里面的方法)
基本就是这样。没什么特别难懂的东西。使用Messenger就足够了。
绑定服务
Android 基于Message的进程间通信 Messenger完全解析
Android aidl Binder框架浅析
服务
Android 接口定义语言 (AIDL)