一、AndroidIPC机制简介

1Android进程/线程简介

Android系统里,一个应用程序通常包含多个组件(如ActivityService等),这些组件既可以在同一个进程中,也可以在不同的进程中。

默认情况下,一个应用程序的多个组件均位于同一进程(主进程)的同一线程(主线程),如果想让其中的某些组件在非主进程中运行,则可以通过AndroidManifest.xml文件来对相应组件的属性进行设置。

当然,不同应用程序就分别在不同进程中运行了。

每个进程被创建时,都会产生一个主线程以及一个Looper对象和消息队列MQMessageQueue)。主线程的工作就是,不断地查询消息队列,并执行其中的消息。

Android中,对于一个应用程序,主进程的主线程的主要工作就是处理UI事件,每当UI事件发生时,Android框架就会将相应的UI事件送到主线程的消息队列里,当主线程发现消息队列里有新消息时,就取出该消息并进行相应的处理,处理完毕后,再继续执行Looper对象,不断地循环查询消息队列。

2AndroidService简介

Android应用程序框架中,Service是其四大组件之一,负责在后台执行需要长时间运行的任务,而不与UI直接交互。

其他组件可以启动(start)一个Service,然后,该Service就持续在后台运行,即使启动该Service的组件已不再持有焦点,直到启动该Service的组件调用了stopService方法或者该Service自己调用了stopElf方法为止;另外,其他组件也可以将自己绑定(Bind)到一个Service上,以实现与该Service进行通信,即使该Service与该组件处于不同的进程之中。

实际上,Service有两种方式开始工作:

1)Started

当一个组件(比如Activity)通过调用方法startService启动一个Service 后,该Service就被称为“Started”。

一旦一个Service处于“Started”,该Service就能够持续地在后台运行,即使启动该Service的组件已经被销毁。

通常,通过这种方式开始工作的Service仅仅执行一个单独的操作,而并不向启动该Service的组件返回操作结果等信息。例如,有一个Service,仅仅负责向网络上传或从网络下载数据,当数据下载或上传完成时,Service就停掉自己。

2)Bound

当一个组件通过调用方法bindService将自己绑定到一个Service上时,该Service就被称为Bound

一个已“Bound”的Service提供了一个C/S接口,以允许该组件能够与该Service进行通信,比如向Service发送请求,并从Service获取结果,甚至进行跨进程的通信(IPC)。

一个已“Bound”的Service的运行时间跟绑定该Service的组件相同。

当然,一个Service既可以是“Started”的,也可以是“Bound”的,一个Service可同时拥有这两种形式,这只需要通过同时实现其接口onStartonBind即可。

无论你的应用程序的ServiceStartedBound还是同时拥有这两种形式,所有其他的组件,即使是处于不同进程的组件也都可以通过一个Intent来启动该Service,就像启动一个Activity一样。当然,你也可以通过在AndroidManifest.xml文件中将你的Service声明为私有的方式,以阻止来自于其他应用程序组件对其的访问。

要定义一个自己的Service,只需从Service类派生一个自己的类,并重载其中的几个方法即可:

1)onStartCommand

当一个组件调用startService时,系统会调用该方法

2)onBind

当一个组件调用bindService时,系统会调用该方法

3)onCreate

Service对象被创建时,系统会首先调用该方法

4)onDestory

Service销毁时,系统会最后调用该方法

3AndroidIBinder/Binder框架简介

在同一进程中,各个组件进行通信是十分方便的,普通的函数调用就可解决;但是,对于处于不同进程中的组件来说,要进行通信,就需要用到AndroidIPC机制了。

对应用开发者来说,AndroidIBinder/Binder框架实现了AndroidIPC通信。当然,IBinder/Binder框架既可以用来实现进程内通信(本地通信),也可实现进程间通信(远程通信)。

AndroidSDK中对IBinder/Binder的解释可知,IBinder/BinderAndroid远程对象的基本接口,它是Android用于提供高性能IPC通信而设计的一套轻量级远程调用机制的核心部分。该接口描述了与一个远程对象进行通信的抽象协议。

AndroidSDK中提到,有两种方式来使用IBinder/Binder框架以实现IPC通信:

1)使用AndroidSDK提供的aidl工具

具体使用方式后面再介绍

2)直接实例化Binder类或者从Binder类派生出自己的Binder类。

这种方式下,我们经常从Binder类派生出自己的Binder类,并重载其中 的方法onTransact,这样,就可以定义一个远程对象(IBinder接口对象), 进而实现IPC通信。

下面简单以ActivityService在不同进程为简单例介绍一下应用开发者如何利用Android提供的IBinder/Binder框架实现IPC通信的方法步骤:

1)首先,假定我们的应用程序包含两个组件,一个是Activity,在主进程中, 一个是Service,在进程名为remote的进程中,这可以通过在 AndroidManifest.xml文件中申明。

2)其次,从Service类派生出自己的Service类:

publicclassMyServiceextendsService{}

MyService中,需要从Binder类派生一个自己的Binder类,并重载其 onTransact方法。

另外,还需要重载Service类的onCreateonBind方法。

3)最后,在派生的Activity类中,调用bindService方法来与Service进行绑 定。

最后,需要注意的是,通过AndroidIBinder/Binder框架,既可以实现进程内通信,也可以实现跨进程通信(IPC)。

更多相关文章

  1. 浅析android通过jni控制service服务程序的简易流程
  2. Android四大基本组件介绍与生命周期
  3. Android四大组件的理解
  4. 第三章 Android程序设计基础
  5. android用户界面-组件Widget-地图视图MapView
  6. Android(安卓)组件资源库
  7. android用户界面-组件Widget-画廊视图Gallery
  8. 2011年Android(安卓)Camera学习笔记之一
  9. Android(安卓)Paging组件Demo

随机推荐

  1. ToolBar代替Actionbar在AppCompatActivit
  2. Android开发者如何搭建服务器
  3. Android(安卓)Activity 生命周期全解析
  4. Android AIDL分析例子源码
  5. Android(安卓)studio 多渠道打包
  6. Android的界面设计规范
  7. Android(安卓)service binder aidl 关系
  8. androidのPULL方式解析XML
  9. 专项测试(三)内存泄漏调试经验分享 (一)
  10. Android(安卓)1.5 1.6 2.0 2.1 2.2区别