Service练习——通过Messenger(信使)来实现IPC通讯(Messenger底层使用AIDL实现)
2014-11-05 02:25
549 查看
通过Messenger(信使)来实现IPC通讯(Messenger底层使用AIDL实现)
步骤:
服务端
1、在Service中创建一个Handler对象,用于处理消息
2、在Service中创建一个Messenger对象,并绑定Handler
3、在onBind方法中通过Messenger.getBinder方法返回绑定的对象
客户端
4、通过bindService来绑定一个服务,在提供的ServiceConnection对象的onServiceConnected方法中,
通过IBinder参数来创建Messenger对象,这样客户端与服务端就使用同一个IBinder
5、客户端向服务端发送消息,通过Messenger的send方法发送一个Message对象
6、以上可实现客户端到服务端的单向通讯,如需要实现双向通讯:
(1)在客户端再创建一个Messenger对象,并绑定一个Handler来处理消息
(2)在向服务端发送消息对象(Message)时,使用replyTo属性指定服务端可向客户端回复消息的Messenger对象,
这样,服务端就可以利用replyTo向客户端发送消息。
新建一个服务端(Service)
然后在清单文件中进行注册
接着在客户端中
总结:Service是一个应用程序组件,可以长时间在后台运行,不提供用户界面
通过绑定(bind)一个服务来实现进程间的通讯(IPC通讯)
步骤:
服务端
1、在Service中创建一个Handler对象,用于处理消息
2、在Service中创建一个Messenger对象,并绑定Handler
3、在onBind方法中通过Messenger.getBinder方法返回绑定的对象
客户端
4、通过bindService来绑定一个服务,在提供的ServiceConnection对象的onServiceConnected方法中,
通过IBinder参数来创建Messenger对象,这样客户端与服务端就使用同一个IBinder
5、客户端向服务端发送消息,通过Messenger的send方法发送一个Message对象
6、以上可实现客户端到服务端的单向通讯,如需要实现双向通讯:
(1)在客户端再创建一个Messenger对象,并绑定一个Handler来处理消息
(2)在向服务端发送消息对象(Message)时,使用replyTo属性指定服务端可向客户端回复消息的Messenger对象,
这样,服务端就可以利用replyTo向客户端发送消息。
新建一个服务端(Service)
package com.example.service_messenges; import android.annotation.SuppressLint; 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.os.RemoteException; import android.widget.Toast; public class MessengesService extends Service { public static final int SAY_MSG = 0x1; // 创建一个信使对象,并绑定信使处理器,由信使处理器来处理 private Messenger m = new Messenger(new InComingHandler()); // 用来操作msg的handler @SuppressLint("HandlerLeak") class InComingHandler extends Handler { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case SAY_MSG: String name = msg.obj.toString(); Toast.makeText(MessengesService.this, "我是" + name + ",我为自己带盐", Toast.LENGTH_SHORT).show(); // 当我需要返回一个值的时候就再写一个信件给信使 Message m = Message.obtain(); m.what = SAY_MSG; m.obj = "我是" + name + ",我为自己带盐"; try { msg.replyTo.send(m); } catch (RemoteException e) { // TODO Auto-generated catch block e.printStackTrace(); } break; default: break; } } } // 绑定m @Override public IBinder onBind(Intent arg0) { return m.getBinder(); } }
然后在清单文件中进行注册
<service android:name="com.example.service_messenges.MessengesService"></service>
接着在客户端中
package com.example.service_messenges; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; import android.os.Message; import android.os.Messenger; import android.os.RemoteException; import android.app.Activity; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.view.View; import android.widget.EditText; import android.widget.Toast; public class MainActivity extends Activity { private Messenger m; private boolean mBound = false; private EditText et; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); et = (EditText) findViewById(R.id.editText1); } private Handler handler=new Handler(){ public void handleMessage(Message msg){ switch (msg.what) { case MessengesService.SAY_MSG: String info="这是传递来的→"+msg.obj.toString(); Toast.makeText(MainActivity.this, info,Toast.LENGTH_SHORT).show(); break; default: break; } }; }; private Messenger mReplyTo = new Messenger(handler); public void msgClick(View v) { // 这样的效率高 Message msg = Message.obtain(); msg.what = MessengesService.SAY_MSG; String name = et.getText().toString(); msg.obj = name; msg.replyTo=mReplyTo; try { m.send(msg); } catch (RemoteException e) { e.printStackTrace(); } } private ServiceConnection conn = new ServiceConnection() { @Override public void onServiceDisconnected(ComponentName arg0) { // 这里是失败了 mBound = false; m = null; } @Override public void onServiceConnected(ComponentName arg0, IBinder arg1) { // 这里是成功了 m = new Messenger(arg1); } }; @Override protected void onStart() { super.onStart(); Intent intent = new Intent(this, MessengesService.class); bindService(intent, conn, Context.BIND_AUTO_CREATE); mBound = true; } @Override protected void onStop() { super.onStop(); if (mBound) { mBound = false; unbindService(conn); } } }
总结:Service是一个应用程序组件,可以长时间在后台运行,不提供用户界面
通过绑定(bind)一个服务来实现进程间的通讯(IPC通讯)
相关文章推荐
- Service练习——通过Messenger(信使)来实现IPC通讯(Messenger底层使用AIDL实现)
- 示例:Android使用AIDL实现跨进程通讯(IPC)
- android使用AIDL实现跨进程通讯(IPC)
- android使用AIDL实现跨进程通讯(IPC)
- Android Studio 实现使用AIDL的IPC通讯
- IPC(三)---IPC实现之Messenger和AIDL的使用讲解
- Android应用中通过AIDL机制实现进程间的通讯实例
- Android应用中通过AIDL机制实现进程间的通讯实例
- Android中RemoteService的使用详解(Aidl、IPC机制)
- Android 绑定Service的实现方法二:使用Messenger
- Messenger 实现Activity与Service通讯、进程通讯
- 基础总结篇之四:Service完全解析——使用AIDL实现进程间的通信
- 安卓四大组件之二#2-使用AIDL技术实现动态调用其他app中的Service的方法
- Android应用中通过AIDL机制实现进程间的通讯实例
- Android应用中通过AIDL机制实现进程间的通讯实例
- Android进阶(二) Activity调用Service 通过AIDL实现
- Android应用中通过AIDL机制实现进程间的通讯实例
- Android应用中通过AIDL机制实现进程间的通讯实例
- Android应用中通过AIDL机制实现进程间的通讯实例
- Android应用中通过AIDL机制实现进程间的通讯实例