Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android 進程間通信

android 進程間通信

編輯:關於Android編程

我們在開發過程中可能會使用Service後台服務,而後台服務可能需要與Activity之間進行數據交互。
這時我們可以假設Activity為客戶端程序,而服務Service為服務端。
以下是信使(Messenger)對象的使用概要:
1. 服務端實現的一個處理器(Handler接口),這個處理器針對每次來自客戶端的調用接收一次回調;
2、 客戶端實現的一個處理器(Handler接口),這個處理器針對每次客戶端向服務端發送消息

2. 這個處理器被用於創建一個信使對象(Messager)(這個信使對象要引用這個處理器);

3. 信使對象創建一個創建一個服務端從onBind()方法中返回給客戶端的IBinder對象;

4. 客戶端使用這個IBinder對象來實例化這個信使對象(信使引用了服務端的處理器),客戶端使用這個信使給服務端發送Message對象;

5. 服務端在它的處理器(Handler)的handleMessage()方法中依次接收每個Message對象


客戶端程序:

package com.example.testservice;

import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity implements OnClickListener {
Messenger mService = null;
private Button button;
private int index=1;
//將Handler與Messenger綁定
final Messenger mMessenger = new Messenger(new IncomingHandler());

private ServiceConnection connection = new ServiceConnection() {

public void onServiceDisconnected(ComponentName name) {

}
/*
* 當服務端與客戶端綁定成功後會調用此方法 service為服務端傳遞過來的Messenger對象(non-Javadoc)
* 綁定成功後需要將客戶端的Handler接口通過Messenger發送到服務端
* 以便服務端向客戶端發消息
*/
public void onServiceConnected(ComponentName name, IBinder service) {
mService = new Messenger(service);
Message message = Message.obtain();
message.what=index;
message.replyTo = mMessenger;
try {
mService.send(message);
} catch (RemoteException e) {
e.printStackTrace();
}
}
};

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

button = (Button) findViewById(R.id.button);
button.setOnClickListener(this);

Intent intent = new Intent(this, MyService.class);
//綁定Service
bindService(intent, connection, Context.BIND_AUTO_CREATE);

}

public void onClick(View v) {

Message message = Message.obtain();
message.what=index;
try {
/*
* 向服務端發消息,
*
*/
mService.send(message);
} catch (RemoteException e) {
e.printStackTrace();
}

}

//此Handler接口主要處理來自服務端的發送消息
class IncomingHandler extends Handler{

public void handleMessage(Message msg) {

}

}

}

服務端程序
package com.example.testservice;

import java.util.ArrayList;

import android.app.Service;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
import android.util.Log;

public class MyService extends Service {
/*
* 客戶端的Messenger集合
* 之所以為集合,是因為一個服務端可能對應多個客戶端
*/
ArrayList mClients = new ArrayList();
/**
* 服務端Messenger信使
*/
final Messenger mMessenger = new Messenger(new IncomingHandler());

public void onCreate() {
super.onCreate();
}

public void onDestroy() {
super.onDestroy();
}
/*
* 接收來自客戶端的消息
*/
class IncomingHandler extends Handler {

public void handleMessage(Message msg) {

Log.e("handleMessage", "handleMessage");

switch (msg.what) {
case 1:
Log.e("11111111111", "11111111111");
mClients.add(msg.replyTo);
break;
case 2:

break;
}
}

}
/*
* (non-Javadoc)
* @see android.app.Service#onBind(android.content.Intent)
* 將服務端的Messeager返回給客戶端
*/
public IBinder onBind(Intent intent) {
return mMessenger.getBinder();
}

}

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