一、Android IPC机制简介

1Android进程/线程简介

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

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

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

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

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

2Android Service简介

      在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销毁时,系统会最后调用该方法

3Android IBinder/Binder框架简介

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

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

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

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

1)使用Android SDK提供的aidl工具

      具体使用方式后面再介绍

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

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

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

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

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

      public class MyService extends Service{}

      在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. android退出activity
  2. [一节课堂]Android新兵特训(2012 - 9 - 1
  3. Android(安卓)隐藏虚拟按键
  4. 【移动开发】Android中强大的适配功能---
  5. Android中嵌入lua脚本,初步进阶
  6. Android常用工具库
  7. Android 设备兼容
  8. Android(安卓)Studio插件(不断更新...)
  9. Android应用开发之(你必须知道的android s
  10. Android面试题收集(有详细答案)