使用Messenger实现进程间通信

来源:互联网 发布:vue.js tomcat 编辑:程序博客网 时间:2024/06/05 18:15
Messenger可以翻译为信使,通过它可以在不同进程中传递Message对象,底层是AIDL,一次处理一个请求,不存在并发执行的情形MessagerActivity位于默认进程中,默认进程名为包名:com.zhoujian.androidMessagerService位于私有进程:com.zhoujian.android:romoteandroid:process=":romote"利用Messenger实现跨进程间通信MessagerActivity.javapackage 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.javapackage 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();    }}
0 0
原创粉丝点击