Android IPC编程简介

首先,IPC是(Inter-Process Communication,进程间通信)
一、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)。


转载自:http://blog.csdn.net/gogor/article/details/6638609

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值