使用Messenger实现Activity和Service在不同线程间的通讯

这里使用Messenger进行activity和service的通信,让它提供远程接口,可以实现线程和线程之间的通讯,但是在线程执行的过程中,是按照顺序依次执行,不能做到并发执行。然后存储在replyTo的属性中。这样就不需要使用广播或是aidl的通讯。

1.MessagerService
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2.activity
在这里的操作,可以封装到一个具体的类中,然后通过隐式的intent进行绑定service,这样就降低activity的代码量。
mContext.bindService(new Intent(“com.example.messengerservice.action”),mServiceConnection,Context.BIND_AUTO_CREATE)

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,我可以帮您回答这个问题。 在Java中编写ServiceActivity,可以使用Messenger进行它们之间的通信。 首先,在Service中创建Messenger对象,并在其中实现一个Handler,该Handler用于接收来自Activity的消息。 在Service中,您可以这样创建Messenger对象: ```java public class MyService extends Service { private Messenger messenger = new Messenger(new IncomingHandler()); @Override public IBinder onBind(Intent intent) { return messenger.getBinder(); } private class IncomingHandler extends Handler { @Override public void handleMessage(Message msg) { // 处理来自Activity的消息 } } } ``` 然后,在Activity中,您可以使用ServiceConnection来连接到Service,并在其中创建一个Messenger对象,该对象用于发送消息到Service。 在Activity中,您可以这样实现ServiceConnection: ```java public class MyActivity extends AppCompatActivity { private Messenger messenger; private boolean bound; private ServiceConnection connection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { messenger = new Messenger(service); bound = true; } @Override public void onServiceDisconnected(ComponentName name) { messenger = null; bound = false; } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 连接到Service bindService(new Intent(this, MyService.class), connection, Context.BIND_AUTO_CREATE); } @Override protected void onDestroy() { super.onDestroy(); // 断开与Service的连接 if (bound) { unbindService(connection); bound = false; } } // 发送消息到Service private void sendMessageToService(int what, Object obj) { if (bound) { Message message = Message.obtain(null, what, obj); try { messenger.send(message); } catch (RemoteException e) { e.printStackTrace(); } } } } ``` 在Activity中,您可以使用sendMessageToService方法向Service发送消息。 希望这个答案能够帮助您。如果您还有任何问题,请随时问我。 ### 回答2: Java中的ServiceActivity是Android开发中常用的组件,可以通过Messenger进行交互。下面是一个示例,演示如何使用MessengerServiceActivity之间进行消息传递。 首先,创建一个Service类,命名为MyService。在Service中,创建一个Handler对象来处理Activity发送的消息,并在onBind()方法中返回一个Messenger对象供Activity绑定。 ```java public class MyService extends Service { private final Messenger mMessenger = new Messenger(new IncomingHandler()); @Override public IBinder onBind(Intent intent) { return mMessenger.getBinder(); } private class IncomingHandler extends Handler { @Override public void handleMessage(Message msg) { switch (msg.what) { case 1: // 接收到Activity发送的消息 String message = msg.getData().getString("message"); // 处理消息逻辑 break; default: super.handleMessage(msg); } } } } ``` 接着,在Activity中,创建一个ServiceConnection对象用于绑定Service,并使用Messenger发送消息给Service。 ```java public class MainActivity extends AppCompatActivity { private Messenger mServiceMessenger; private boolean mIsBound; // 绑定Service private final ServiceConnection mServiceConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { mServiceMessenger = new Messenger(service); mIsBound = true; } @Override public void onServiceDisconnected(ComponentName name) { mServiceMessenger = null; mIsBound = false; } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 绑定Service Intent intent = new Intent(this, MyService.class); bindService(intent, mServiceConnection, Context.BIND_AUTO_CREATE); } @Override protected void onDestroy() { super.onDestroy(); // 解绑Service if (mIsBound) { unbindService(mServiceConnection); mIsBound = false; } } // 发送消息给Service private void sendMessageToService(String message) { if (mIsBound) { Message msg = Message.obtain(null, 1); Bundle bundle = new Bundle(); bundle.putString("message", message); msg.setData(bundle); try { mServiceMessenger.send(msg); } catch (RemoteException e) { e.printStackTrace(); } } } } ``` 以上是使用MessengerServiceActivity之间进行消息交互的简单示例。通过在Activity中创建Messenger,并使用bindService()方法绑定Service,即可实现消息的发送和接收。同时,在Service使用Messenger创建Handler处理Activity发送的消息。 ### 回答3: 在Android中,使用Messenger实现ServiceActivity之间的通信可以通过以下步骤来完成。 首先,创建一个Service类来处理接收和处理Activity发送的消息。在Service类中,我们需要定义一个Messenger对象作为Service端的传输通道,并通过Handler处理接收到的消息。 ```java public class MyService extends Service { private Messenger messenger = new Messenger(new IncomingHandler()); private static class IncomingHandler extends Handler { @Override public void handleMessage(Message msg) { switch (msg.what) { //根据msg的what字段判断消息类型 case 1: //处理消息类型为1的逻辑 break; case 2: //处理消息类型为2的逻辑 break; //... } } } @Nullable @Override public IBinder onBind(Intent intent) { return messenger.getBinder(); } } ``` 接下来,在Activity中,我们需要创建一个与Service通信的Messenger对象,并通过它发送消息给Service。 ```java public class MyActivity extends AppCompatActivity { private Messenger messenger; private static class ResponseHandler extends Handler { @Override public void handleMessage(Message msg) { switch (msg.what) { //处理Service响应的消息 //... } } } private Messenger responseMessenger = new Messenger(new ResponseHandler()); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Intent intent = new Intent(this, MyService.class); bindService(intent, new ServiceConnection() { @Override public void onServiceConnected(ComponentName componentName, IBinder iBinder) { messenger = new Messenger(iBinder); //向Service发送消息 sendMessageToService(); } @Override public void onServiceDisconnected(ComponentName componentName) { messenger = null; } }, BIND_AUTO_CREATE); } private void sendMessageToService() { if (messenger != null) { Message message = Message.obtain(null, 1); //设置Service返回结果的Messenger message.replyTo = responseMessenger; try { messenger.send(message); } catch (RemoteException e) { e.printStackTrace(); } } } } ``` 在Activity的onServiceConnected方法中,我们通过IBinder创建与Service通信的Messenger对象。然后,我们可以通过sendMessageToService方法向Service发送一条消息,并设置responseMessenger为接收Service返回结果的Messenger。 在Service中,我们可以通过msg.replyTo获取到ActivityMessenger,然后通过该MessengerActivity发送消息。 通过以上步骤,我们就实现ServiceActivity之间的Messenger交互。当Activity发送消息给Service时,在Service中可以根据消息类型进行相应的处理,并通过设置replyTo字段将结果返回给Activity
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值