使用Messenger实现进程间通信

Messenger可以翻译为信使,通过它可以在不同进程中传递Message对象,底层是AIDL,一次处理一个请求,不存在并发执行的情形

MessagerActivity位于默认进程中,默认进程名为包名:com.zhoujian.android

MessagerService位于私有进程:com.zhoujian.android:romote
android:process=":romote"

利用Messenger实现跨进程间通信

MessagerActivity.java

package com.zhoujian.android.activity;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import com.zhoujian.android.R;
import com.zhoujian.android.service.MessagerService;

/**
 * Created by zhoujian on 2016/11/16.
 */

public class MessagerActivity extends Activity
{

 public static final String TAG="MessagerActivity";

    public static final int MSG_FROM_CLIENT=1;


    //创建接受服务端消息的Messenger和Handler

    Handler handler = new Handler()
    {
        private String mReply;
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what)
            {
                case 2:
                    mReply = msg.getData().getString("reply");
                    Log.e(TAG,"接受的消息来自服务端:"+mReply);
                    break;
            }
        }
    };

    Messenger  replyMessenger = new Messenger(handler);

    ServiceConnection conn = new ServiceConnection()
    {

        private Messenger mMessenger;

        @Override
        public void onServiceConnected(ComponentName name, IBinder binder)
        {

            //创建信使
            mMessenger = new Messenger(binder);

            //创建Message
            Message msg = Message.obtain(null,MSG_FROM_CLIENT);

            //创建Bundle
            Bundle bundle = new Bundle();

            //把消息放入binder
            bundle.putString("messager","你好!我来自客户端");

            //设置数据
            msg.setData(bundle);
            //需要把接受服务端回复的Messenger通过Message的replyTo参数传递给服务端
            msg.replyTo = replyMessenger;

            try
            {
                //用信使发送Mesage
                mMessenger.send(msg);
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
        }

        @Override
        public void onServiceDisconnected(ComponentName name)
        {

        }
    };

    //option+command+k  对生命周期方法进行排序
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_messager);
        Intent intent = new Intent(MessagerActivity.this, MessagerService.class);
        bindService(intent, conn, Context.BIND_AUTO_CREATE);

    }

    @Override
    protected void onRestart()
    {
        super.onRestart();
    }

    @Override
    protected void onStart()
    {
        super.onStart();
    }

    @Override
    protected void onResume()
    {
        super.onResume();
    }

    @Override
    protected void onPause()
    {
        super.onPause();
    }

    @Override
    protected void onStop()
    {
        super.onStop();
    }

    @Override
    protected void onDestroy()
    {
        unbindService(conn);
        super.onDestroy();
    }
}


MessagerService.java

package com.zhoujian.android.service;

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.util.Log;


/**
 * Created by zhoujian on 2016/11/28.
 */

public class MessagerService extends Service
{

    public static final String TAG = "MessagerService";

    public static final int MSG_FROM_CLIENT=1;

    Handler handler = new Handler()
    {

        private String  messager;

        @Override
       public void handleMessage(Message msg)
       {
           switch (msg.what)
           {
               case MSG_FROM_CLIENT:

                   messager = msg.getData().getString("messager");
                   Log.e(TAG,"接受的消息来自客户端:"+messager);

                   //服务端收到客户端的消息后,在发送一条消息到客户端
                   mTo = msg.replyTo;

                   //创建Message

                   Message mMessae = Message.obtain(null,2);

                   Bundle bundle = new Bundle();

                   bundle.putString("reply","您的消息已经收到,稍后给您回复!");

                   mMessae.setData(bundle);

                   try
                   {
                       mTo.send(mMessae);
                   }
                   catch (Exception e)
                   {
                       e.printStackTrace();
                   }
           }
       }
    };

    Messenger mMessenger = new Messenger(handler);

    @Override
    public IBinder onBind(Intent intent)
    {
        return mMessenger.getBinder();
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值