Android中的跨进程通信大体有6中方式,
1、Handler + Looper(子线程与UI线程之间的通信)
2、Activity(显示启动和隐式启动)
3、ContentProvider(数据存储和数据共享)
4、BroadcasrReceiver(系统广播和自定义广播)
5、Service(startService和bindService)
6、aidl (跨进程间通信,使用bindService得到binder对象,才能调用远程接口)
在使用上面的区别:
方式
同一个APK
跨APK
传数据
共享接口
Handler+Looper
Yes
NO
Yes
NO
Activity
Yes
Yes
Yes
NO
ContentProvider
Yes
Yes
Yes
NO
BroadcastReceiver
Yes
Yes
Yes
NO
Service
Yes
Yes
Yes
NO
AIDL
Yes
Yes
Yes
Yes
1、Handler+Looper机制
Message:消息。其中包含了消息ID,消息处理对象以及处理的数据等等,由于Message Queue管理,最后由Handler进行处理。
Handler:处理者。负责Message的发送及处理。使用Handler时,需要实现handlerMessage方法,来对特定的Message进行处理,如更新UI。
MessageQueue:消息队列。用来存放Handler发送过来的消息,并且按照FIFO规则执行。当然存放Message并非实际的存放,而是用链表的形式存放,等等Looper的抽取。
Looper:消息泵。不断地从MessageQueue中抽取Message并且发送给Handler进行处理,因此一个MessageQueue需要一个Looper进行管理。 它们的关系如图:
注意:
一个线程对应一个Looper,一个Looper对应一个MessageQueue,一个线程可以有多个Handler,由Looper对消息进行分发到Handler的handleMessage中处理。
用法:在开发中使用Handler+Looper的方式主要用于将子线程的操作结果反馈给主线程以便更新UI。
2、Activity
Activity在Android中的作用以及它的生命周期就不说了。这里只介绍它在数据传递上面的方式。Activity之间的数据传递主要是通过Intent.putXXX参数,传递到接收方。作为启动Activity的传递参数,不仅可以启动本apk中的activity,还可以启动另外apk中的activity。在启动方式上分为显式启动和隐式启动,显式启动就是在初始化Intent时指定目标activity的包名和类名。隐式启动就是通过指定目标activity的action属性(如果已指定并且是DEFAULT模式)来启动activity。
3、ContentProvider
Android中的内容提供者,主要用在不同apk之间数据共享。如android手机中的联系人等。
4、BroadcastReceiver
Android中的广播接收器,不断可以捕捉系统发出的广播也可以自定义广播的发送和接收。广播又分为常驻广播和非常驻广播,有序广播和无序广播。如果是自定义广播,需要自己定义Actiion。
5、Service
Android里面的Service在启动上有两种方式,一种是startService另外一种是bindService,对service的影响和方法执行也不一样。StartService时执行Service里onCommandStart方法,而bindService时执行的是onBind方法。在初始化Intent时跟启动Activity时初始化Intent差不多,有两种方式,指定全名或是指定Action但是如果是指定Action的话,此Service必须有DEFAULT属性,同样可以在Intent中putXXX给目标Service传参数。
6、AIDL
AndroidAIDL机制是跨进程之间通讯的方式,主要用在不同apk之间的通信。同一个apk中,没有必要用AIDL。至于通过AIDL来实现进程间的通信,网上很多例子。其核心的内容就是通过Binder!