当前位置:操作系统 > 安卓/Android >>

Android bound service 详解三:使用Messenger

如果你需要你的service与远程进程通信,那么你可以使用一个Messenger来为你的service提供接口.此技术使用不必使用AIDL就能执行进程间通信(IPC).

  下面是如何使用Messenger的概要:

service实现一个接收从客户端的每个调用引起的回调的Handler.

Handler被用来创建一个Messenger对象(它是Handler的一个引用).

Messenger创建一个从service的onBind()返回给客户端的IBinder.

客户端使用IBinder来实例化这个Messenger(它引用到service的Handler),客户端用它来向service发送Message.

service在它的Handler中接收每个消息—具体的,是在handleMessage()方法中.

  这此方式下,service中没有能让客户端调用的方法,客户端传送的是service在它的Handler中接收的"消息"(Message对象).


下面是一个service使用Messenger接口的例子:

[java] public class MessengerService extends Service { 
    /** 让service 显示一个消息的命令 */ 
    static final int MSG_SAY_HELLO = 1; 
 
    /**
     * 处理从客户端来的消息.
     */ 
    class IncomingHandler extends Handler { 
        @Override 
        public void handleMessage(Message msg) { 
            switch (msg.what) { 
                case MSG_SAY_HELLO: 
                    Toast.makeText(getApplicationContext(), "hello!", Toast.LENGTH_SHORT).show(); 
                    break; 
                default: 
                    super.handleMessage(msg); 
            } 
        } 
    } 
 
    /**
     * 我们发布给客户端使它能向IncomingHandler 发送消息的的对象
     */ 
    final Messenger mMessenger = new Messenger(new IncomingHandler()); 
 
    /**
     * 当绑定到service,我们返回指向我们的messenger的接口
     */ 
    @Override 
    public IBinder onBind(Intent intent) { 
        Toast.makeText(getApplicationContext(), "binding", Toast.LENGTH_SHORT).show(); 
        return mMessenger.getBinder(); 
    } 

public class MessengerService extends Service {
    /** 让service 显示一个消息的命令 */
    static final int MSG_SAY_HELLO = 1;

    /**
     * 处理从客户端来的消息.
     */
    class IncomingHandler extends Handler {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case MSG_SAY_HELLO:
                    Toast.makeText(getApplicationContext(), "hello!", Toast.LENGTH_SHORT).show();
                    break;
                default:
                    super.handleMessage(msg);
            }
        }
    }

    /**
     * 我们发布给客户端使它能向IncomingHandler 发送消息的的对象
     */
    final Messenger mMessenger = new Messenger(new IncomingHandler());

    /**
     * 当绑定到service,我们返回指向我们的messenger的接口
     */
    @Override
    public IBinder onBind(Intent intent) {
        Toast.makeText(getApplicationContext(), "binding", Toast.LENGTH_SHORT).show();
        return mMessenger.getBinder();
    }
}

 

 

注意Handler中的handleMessage()方法是service接收消息并进行处理的地方.

  客户端所有要做的事就是创建一个基于service返回的IBinder的Messenger对象并且使用它的send()发送一个消息.如,下面是一个actvity绑定到service并且传送MSG_SAY_HELLO命令给service的例子:


[java] public class ActivityMessenger extends Activity { 
    /** 与service通信的Messenger */ 
    Messenger mService = null; 
 
    /** 表明我们是否已绑定到service的标记 */ 
    boolean mBound; 
 
    /**
     *与service的主接易做图互的类
     */ 
    private ServiceConnection mConnection = new ServiceConnection() { 
        public void onServiceConnected(ComponentName className, IBinder service) { 
            // 当与service的连接已经建立时被调用.给了我们可以用来  
            //与service交互的对象.我们正在使用一个Messenger与service通信,  
            // 所以在这里我们从原始IBinder 对象获取一个客户端的Messenger的代表  
            mService = new Messenger(service); 
            mBound = true; 
        } 
 
        public void onServiceDisconnected(ComponentName className) { 
            // 当与service的连接意外断开时被调用-- 也就是,service的进程崩溃了  
            mService = null; 
            mBound = false; 
        } 
    }; 
 
    public void sayHello(View v) { 
        if (!mBound) return; 
        // 创建并发送一个消息给service  
        Message msg = Message.obtain(null, MessengerService.MSG_SAY_HELLO, 0,

补充:移动开发 , Android ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,