如果你需要你的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。

我是天王盖地虎的分割线

参考:http://www.cnblogs.com/mengdd/tag/Android/default.html?page=4

更多相关文章

  1. 【原创】【Android(安卓)Camera】—— 关于FaceDetection
  2. Android(安卓)Launcher3安装应用后,控制应用图标显示位置
  3. android自定义相机添加自定义水印
  4. Android(安卓)事件分发机制(最新源码6.0分析)--ViewGrop
  5. android 自定义view中onMeasure()理解
  6. Android欢迎页面闪屏解决方法
  7. Android进程优先级部分整理与理解
  8. Android(安卓)-- Messager与Service
  9. Android(安卓)依赖注入: Dagger 2 实例讲解(一)

随机推荐

  1. Android(安卓)Java层的anti-hooking技巧
  2. android网络与通信
  3. Android开发基础01——Android(安卓)SDK
  4. Android(安卓)实现ListView的点击变色的
  5. 腾讯的Android助手占用adb,android sdk无
  6. (原创)Android(安卓)Studio常用快捷键大全
  7. android 如何动态打印日志
  8. Android基于javamail发送带附件邮件
  9. Android如何预置数据库或库文件
  10. 如何获取 Android(安卓)设备的CPU核数、