Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1042743
  • 博文数量: 403
  • 博客积分: 10272
  • 博客等级: 上将
  • 技术积分: 4407
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-24 14:22
文章分类

全部博文(403)

文章存档

2012年(403)

分类: 嵌入式

2012-05-09 20:13:46

Service绑定到Android Component组件上,其通讯方式一般是如下三种

  1. 在onBind(Intent intent)中返回Binder对象,通过此接口与Service交互
  2. 通过IBinder对象创建一个Messenger,通过Handler的方式来与Service交互
  3. 通过AIDL进行交互

 

第一种返回Binder的方式是最为方便的,因为可以在Binder中直接返回Service实例,使Component直接与 Service 通信。

但是存在一个局限性,就是只有在Service与Component在同一个进程中的时候才可以通过Binder的方式进行,如果这个Service是一个程序内部使用的,那么这种方式是首选的通信方式。

其中需要注意的是:当多个Component绑定到同一个Service的时候,系统只会在第一个Component进行绑定的时候调用onBind方法,而其他的Component在绑定的时候,直接返回第一个返回的Binder,也就是说,多个组件是用的同一个Binder。

如果企图在不同进程间返回Binder,系统会在运行时报错。

 

第二种是通过一个Messenger进行交互,Messenger的创建和使用都很简单,如下:

复制代码

//在Service中 @Override
public IBinder onBind(Intent arg0) { return mMessenger.getBinder(); } private Messenger mMessenger = new Messenger(new HelloHandler()); class HelloHandler extends Handler{ @Override public void handleMessage(Message msg) { Toast.makeText(getApplicationContext(), "Hello", Toast.LENGTH_SHORT).show(); super.handleMessage(msg); } }
复制代码

 

复制代码
//在Activity中
private Messenger mMessenger ; private ServiceConnection sc = new ServiceConnection(){ public void onServiceConnected(ComponentName name, IBinder service) { Log.i(TAG, "服务连接"); mMessenger = new Messenger(service); mBound = true; } public void onServiceDisconnected(ComponentName name) { Log.i(TAG, "断开服务"); mBound = false; } };
复制代码

 

这样就可以通过发送消息的方式来与Service沟通了,其中Messenger的优势在于,他可以在Service与Compontent位于不同进程的时候来通信,这个是Binder方式无法做到的,Messenger底层是使用AIDL实现的。

 

一般来说前两种可以满足大多数程序的需求,如果要做并发处理的Service,那么要使用AIDL来实现,具体见http://developer.android.com/guide/developing/tools/aidl.html

component

阅读(1891) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~