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<Messenger> mClients = new ArrayList<Messenger>();
 /**
  * 服务端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();
 }

}

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。