进程间通信Messenger的简单使用
2017-07-26 17:21
316 查看
一般进程间通信都是通过aidl实现,但是一些简单的就不需要aidl了,太麻烦了,需要写好多文件和接口。安卓提供了api,就是Messenger,简单说下使用方法吧。
一般分为客户端和服务端两块,一般客户端就是负责发起一个任务的,而服务端就是负责这个任务的具体业务逻辑的执行。比如我需要两个数的求和,那么客户端就负责将这个需求发送到服务端,由服务端去做两个数求和这样一个业务逻辑处理。
先贴下服务端的代码,服务端一般就是一个Service,在其中实现onBind方法并将Messenger的IBinder对象提供出去。
代码段中圈红的代码就是表示将结果发送给服务端,onBind方法必须返回Messenger的IBinder对象。
这里注意Manifest中注册的有个exported属性必须置为true,表示你注册的Service可以被外部引用和绑定。
注意圈红部分的代码就可以了,我们把message replyTo给我们new出的messenger后就可以在handlerMessage的回调方法中获取求和后的结果了,就是MessengerService中的message.arg2的值了。
一般分为客户端和服务端两块,一般客户端就是负责发起一个任务的,而服务端就是负责这个任务的具体业务逻辑的执行。比如我需要两个数的求和,那么客户端就负责将这个需求发送到服务端,由服务端去做两个数求和这样一个业务逻辑处理。
先贴下服务端的代码,服务端一般就是一个Service,在其中实现onBind方法并将Messenger的IBinder对象提供出去。
public class MessengerService extends Service { private Messenger messenger = new Messenger(new Handler() { @Override public void handleMessage(Message msg) { Message message = Message.obtain(msg); switch (msg.what) { //收到客户端的请求求和的消息 case 1: try { message.arg2 = message.arg1 + message.arg2; message.replyTo.send(message); } catch (RemoteException e) { e.printStackTrace(); } break; } super.handleMessage(msg); } }); @Nullable @Override public IBinder onBind(Intent intent) { //返回messenger的binder对象 return messenger.getBinder(); }
代码段中圈红的代码就是表示将结果发送给服务端,onBind方法必须返回Messenger的IBinder对象。
这里注意Manifest中注册的有个exported属性必须置为true,表示你注册的Service可以被外部引用和绑定。
<service android:name=".messenger.MessengerService" android:enabled="true" android:exported="true"> <intent-filter> <action android:name="com.zhy.aidl.calc"></action> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </service>下面看下客户端部分的代码,就两个部分,一个是绑定我们上面的MessengerService,还有一个就是做求和的操作。
public class MessengerActivity extends Activity { private Messenger messengerService; private Messenger messenger = new Messenger(new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case 1: //通知更新ui break; } super.handleMessage(msg); } }); private ServiceConnection conn = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { messengerService = new Messenger(service); } @Override public void onServiceDisconnected(ComponentName name) { messengerService = null; } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_messenger); bindService(); try { getSum(2, 4); } catch (RemoteException e) { e.printStackTrace(); } } private void bindService() { Intent intent = new Intent(); //必须显式调用,注意类名要全,前面跟上包名 intent.setComponent(new ComponentName("包名", "类名")); bindService(intent, conn, BIND_AUTO_CREATE); } /** * 客户端发起的求和操作 */ private void getSum(int a, int b) throws RemoteException { Message msg = new Message(); msg.what = 1; msg.arg1 = a; msg.arg2 = b; msg.replyTo = messenger; messengerService.send(msg); }
注意圈红部分的代码就可以了,我们把message replyTo给我们new出的messenger后就可以在handlerMessage的回调方法中获取求和后的结果了,就是MessengerService中的message.arg2的值了。
相关文章推荐
- BindService 使用Messenger 实现最简单的进程间通信
- Android进程间通信之使用Messenger
- Android进程间通信之使用Messenger
- Messenger(信使(跨应用传递对象(数据)))的简单使用
- 使用Messenger实现进程间通信
- 使用Messenger进行进程间通信
- 使用Messenger实现进程间通信(IPC)
- 使用AIDL完成一次简单的Android进程间通信
- Android应用进程间通信之Messenger信使使用及源码浅析
- Android进程间通信之使用Messenger
- IPC 主要是messenger和aidl的使用和简单分析
- Android应用进程间通信之Messenger信使使用及源码浅析
- Android 的进程间通信 Binder——Messenger的入门使用
- android:使用Messenger进行进程间通信(二)
- Android应用进程间通信之Messenger信使使用及源码浅析
- Android应用进程间通信之Messenger信使使用及源码浅析
- Qt IPC 进程间通信 的简单使用 QLocalServer与QLocalSocket
- Messenger(信使)进程间通信使用
- Android应用进程间通信之Messenger信使使用及源码浅析
- Android进程间通信-AIDL的简单使用