Android -- Messager与Service

如果你需要你的service和其他进程通信,那么你可以使用一个Messenger来提供这个接口。

这种方法允许你在不使用 AIDL的情况下,进行跨进程通信IPC。

实现步骤                                                                              

下面是一个如何使用 Messenger的小总结:

  1. service实现一个 Handler 接收客户端每一次调用的回调。

  2. Handler 用来创建一个Messenger对象,它是一个Handler的引用。

  3. Messenger创建一个 IBinder,service从 onBind()中把它返回给客户端。

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

  5. service在它的Handler中接收每一个Message对象,在它的 handleMessage()方法中。

Code                                                                                   

复制代码
public class MessengerService extends Service

{

    /** Command to the service to display a message */

    static final int MSG_SAY_HELLO = 1;



    /**

     * Handler of incoming messages from clients.

     */

    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);

            }

        }

    }



    /**

     * Target we publish for clients to send messages to IncomingHandler.

     */

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



    /**

     * When binding to the service, we return an interface to our messenger for

     * sending messages to the service.

     */

    @Override

    public IBinder onBind(Intent intent)

    {

        Toast.makeText(getApplicationContext(), "binding", Toast.LENGTH_SHORT)

                .show();

        return mMessenger.getBinder();

    }

}
复制代码

  注意 Handler中的 handleMessage() 方法是service接收到来的 Message并且决定做什么的地方。

  客户端需要做的仅仅是创建一个基于service所返回的 IBinder的 Messenger,然后用 send()方法发送信息。

  比如,这里有一个简单的activity和service绑定并且发送信息给service:

复制代码
public class ActivityMessenger extends Activity

{

    /** Messenger for communicating with the service. */

    Messenger mService = null;



    /** Flag indicating whether we have called bind on the service. */

    boolean mBound;



    /**

     * Class for interacting with the main interface of the service.

     */

    private ServiceConnection mConnection = new ServiceConnection()

    {

        public void onServiceConnected(ComponentName className, IBinder service)

        {

            // This is called when the connection with the service has been

            // established, giving us the object we can use to

            // interact with the service. We are communicating with the

            // service using a Messenger, so here we get a client-side

            // representation of that from the raw IBinder object.

            mService = new Messenger(service);

            mBound = true;

        }



        public void onServiceDisconnected(ComponentName className)

        {

            // This is called when the connection with the service has been

            // unexpectedly disconnected -- that is, its process crashed.

            mService = null;

            mBound = false;

        }

    };



    public void sayHello(View v)

    {

        if (!mBound)

            return;

        // Create and send a message to the service, using a supported 'what'

        // value

        Message msg = Message

                .obtain(null, MessengerService.MSG_SAY_HELLO, 0, 0);

        try

        {

            mService.send(msg);

        }

        catch (RemoteException e)

        {

            e.printStackTrace();

        }

    }



    @Override

    protected void onCreate(Bundle savedInstanceState)

    {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

    }



    @Override

    protected void onStart()

    {

        super.onStart();

        // Bind to the service

        bindService(new Intent(this, MessengerService.class), mConnection,

                Context.BIND_AUTO_CREATE);

    }



    @Override

    protected void onStop()

    {

        super.onStop();

        // Unbind from the service

        if (mBound)

        {

            unbindService(mConnection);

            mBound = false;

        }

    }

}
复制代码

  注意这个例子并没有展示service如何响应客户端,如果你想要service响应,你需要在客户端中创建一个 Messenger。

  然后当客户端接收到onServiceConnected()回调方法时,它会发送一个 Message到service,在它的send() 方法的replyTo参数中包含了客户端的Messenger。

你可能感兴趣的:(android)