Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android系統教程 >> Android開發教程 >> Android ApiDemos示例解析(41):App->Service->Messenger Service

Android ApiDemos示例解析(41):App->Service->Messenger Service

編輯:Android開發教程

前面LocalService 主要是提供同一Application中組件來使用,如果希望支持不同應用或進程使用Service。可以通過 Messenger。使用Messgener可以用來支持進程間通信而無需使用AIDL。

下面步驟說明裡Messenger的使用方法:

在Service中定義一個Handler來處理來自Client的請求。

使用這個Handler創建一個Messenger (含有對Handler的引用).

Messenger創建一個IBinder對象返回給Client( onBind方法)。

Client 使用從Service返回的IBinder重新構造一個Messenger 對象,提供這個Messenger對象可以給Service 發送消息。

Service提供Handler接受來自Client的消息Message. 提供handleMessage來處理消息。

在這種方式下,Service沒有定義可以供Client直接調用的方法。而是通過”Message”來傳遞信息。

本例Messenger Service 涉及到兩個類 MessengerServiceActivities 和 MessengerService.

首先看看Service的定義,在 MessengerService定義了一個IncomingHandler ,用於處理來自Client的消息。

/** 
* Handler of incoming messages from clients.
*/
class IncomingHandler extends Handler {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_REGISTER_CLIENT:
mClients.add(msg.replyTo);
break;
case MSG_UNREGISTER_CLIENT:
mClients.remove(msg.replyTo);
break;
case MSG_SET_VALUE:
mValue = msg.arg1;
for (int i=mClients.size()-1; i>=0; i--) {
try {
mClients.get(i).send(Message.obtain(null,
MSG_SET_VALUE, mValue, 0));
} catch (RemoteException e) {
// The client is dead. Remove it from the list;
// we are going through the list from back to front
// so this is safe to do inside the loop.
mClients.remove(i);
}
}
break;
default:
super.handleMessage(msg);
}
}
}

然後使用這個IncomingHandler定義一個Messenger。

final Messenger mMessenger = new Messenger(new IncomingHandler());

應為這種方法采用的“Bound” Service模式,onBind 需要返回一個IBind對象, 可以通過 mMessenger.getBinder()返回與這個Messenger關聯的IBinder對象,Client可以通過這個IBinder對象重新構造一個Messenger對 象,從而建立起與Service之間的通信鏈路。

@Override 
public IBinder onBind(Intent intent) {
 return mMessenger.getBinder();     
}

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved