Android Service完全解析(二)
2016-07-12 23:31
489 查看
Service完全解析(二)
1.Messenger介绍2.使用Messenger实现跨进程通信
3.相关知识点及注意事项
Messenger扮演信使的角色,它指向一个Handler,可以通过这个信使向其指向的Handler传递数据。
要实现跨进程通信,其实质是在不同进程间传递Messenger。客户端向服务器端发送数据,只要得到服务器端的信使,然后调用send()方法即可;服务器端向客户端发送数据也一样,先得到客户端的信使,调用send()方法即可。
服务器端向客户端传递信使的方法是:
(1)创建Messenger对象;
(2)在onBind()方法中返回Messenger.getBind();
(3)客户端在onServiceConnected()方法中以new Messenger(IBinder对象)的方法获取到一个Messenger,这个Messenger就是服务器端的信使。
客户端向服务器端传递信使的方法是:
(1)创建一个Messenger对象;
(2)创建一个Message对象,这个对象是要发送给服务器的;
(3)将上面创建的Messenger对象给Message对象:Message.replyTo = Messenger;
(4)将这个Message对象发送给服务器端即可。
代码分析:
服务器端代码:public MessageService() { /*创建一个Handler处理来自客户端的Message*/ mHandler = new Handler(){ @Override public void handleMessage(Message msgfromclient){ Log.v("out","当前线程:"+android.os.Process.myPid()+"收到客户端的数据为:"+msgfromclient.what); /*得到来自客户端的信使*/ Messenger messengerfromclient = msgfromclient.replyTo; Message messagetoclient = Message.obtain(null,123456789); try { messengerfromclient.send(messagetoclient); } catch (RemoteException e) { e.printStackTrace(); } } }; /*根据上面的Handler生成一个Messenger对象,Messenger:信使,指向一个Handler,可以通过 * 这个Messenger来将Message发给其指向的Handler处理*/ mMessenger = new Messenger(mHandler); } @Override public IBinder onBind(Intent intent) { /*通过这一步操作将Messenger返给客户端*/ return mMessenger.getBinder(); }
客户端代码:
private ServiceConnection conn; private Messenger mMessengerService,mMessengerClient; private Message msgToService; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_message_service); mMessengerClient = new Messenger(new Handler(){ @Override public void handleMessage(Message msgfromservice){ Log.v("out","收到了来自服务器端的数据:"+msgfromservice.what); } }); /*为了能让服务器也给客户端发送数据,我们需要将客户端的信使传递给服务器端,服务器端将信使传递给 * 客户端的方式是通过Binder,客户端将信使传递给服务器端的方式是将信使封装到Message对象中*/ msgToService = Message.obtain(null,123321); msgToService.replyTo = mMessengerClient; /*首先创建ServiceConnection,并从中获取到服务器端的Messenger*/ conn = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { /*得到的是服务端的信使,我们通过这个信使将数据发给服务端*/ mMessengerService = new Messenger(service); try { mMessengerService.send(msgToService); } catch (RemoteException e) { e.printStackTrace(); } } @Override public void onServiceDisconnected(ComponentName name) { } }; bindService(new Intent(MessageServiceActivity.this, MessageService.class),conn,this.BIND_AUTO_CREATE); } @Override public void onDestroy(){ super.onDestroy(); unbindService(conn); }
其他相关知识点
(1)Service运行在UI线程中的。
(1)unBindService()后Service会调用onDestroy()方法,如果Service新开了线程,此时线程仍会执行,如果想关闭,可以在onDestroy()中设置标志。同时,由于onServiceConnected()方法中有Service的Binder的引用,此时仍然可以调用Service中的方法。
相关文章推荐
- Android IPC进程间通讯机制
- android之定时器AlarmManager
- axis备忘
- Windows XP Service Pack 3 RC1 v.3244 winxp补丁3 提供下载
- Run As Service runassrv.exe 详细参数第1/2页
- 安装MySQL在最后的start service停住了解决方法
- MSN Messenger 化繁为简(用 Visual Studio 2005 去掉 MSN 广告)
- android使用Messenger绑定Service的多种实现方法
- WinForm实现跨进程通信的方法
- asp.net Web Service 接口大量数据传输解决方案
- Silverlight中动态获取Web Service地址
- android调用web service(cxf)实例应用详解
- 在Android中 获取正在运行的Service 实例
- ASP.NET State service状态服务的问题解决方法
- 卸载ZkeysPHP 后iis网站出现Service Unavailable 解决办法
- IIS Admin Service 服务因 2149647636 (0x80210514) 服务性错误而停止
- Service Temporarily Unavailable的503错误是怎么回事?
- 深入剖析Android系统中Service和IntentService的区别
- Android中Service服务详解(一)
- 从零开始玩人工智能-机器人服务-03