Activity与Service通过Messenger交互

背景:

最近实现了一个本地版音乐播放,在编写代码过程中遇到个问题:当一首歌在Service中播放时,从后台或播放列表进入播放界面,如何使界面上显示当前播放歌曲的详情信息,如歌名、艺术家、歌词显示的位置、播放进度等。

在上一篇博客中用接口的形式实现Activity与Service无延时的交互,而在这篇中研究的如何使用Messenger实现上述需求。

原理:

Activity 在绑定 Service时,通过Messenger拿到对方引用,然后恰当的调用对应的方法即可。

步骤:
1. 在Activity和Service中分别创建一个Handler对象, 并用该Handler 创建 Messenger对象
2. 在Activity绑定Service时:Service返回其handler和自身引用,当绑定成功后,Activity使用Service返回的handler创建一个Messenger,然后发送自己的handler和自身引用

代码

Activity:

handler:

private Handler uiHandler = new Handler() {

        public void handleMessage(Message msg) {
            switch (msg.what) {
            case FROMSERVICES_TAG:
                service = (AudioPlayerServices) msg.obj;
//msg.arg1是用来判断每次bindService后是否需要重新播放音乐
                if (msg.arg1 == AudioPlayerServices.No_RePlay) { 
                  //播放的是同一首歌,更新界面
                    updateUI(service.getCurItem());
                } else {
                  //否则播放新歌曲
                    service.openAudioPlayer();
                }
                break;
            }
        };
    };

BindSercice:

public void onServiceConnected(ComponentName name, IBinder service) {
            try {
                Messenger servMessenger = new Messenger(service);
                Message msg = Message.obtain();
                msg.what = AudioPlayerServices.FROMUI_TAG;
                msg.replyTo = uiMessenger;
                msg.obj = AudioPlayerActivity.this;
                servMessenger.send(msg);
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }

Service:

private Handler servHandler = new Handler() {

        public void handleMessage(Message msg) {
            switch (msg.what) {
            case FROMUI_TAG:
                activity = (AudioPlayerActivity) msg.obj;
                uiMessenger = msg.replyTo;
                sendMessengerAndContextToUI();
                break;
            }
        }
    };

    /** 向AudioPlayerActivity发送自己的Messenger和引用 */
    private void sendMessengerAndContextToUI() {
        try {
            Message msg = Message.obtain();
            msg.what = AudioPlayerActivity.FROMSERVICES_TAG;
            msg.arg1 = opMusicFlag;
            msg.obj = AudioPlayerServices.this;
            uiMessenger.send(msg);
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    };
  • 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获取到Activity的Messenger,然后通过该MessengerActivity发送消息。 通过以上步骤,我们就实现了ServiceActivity之间的Messenger交互。当Activity发送消息给Service时,在Service中可以根据消息类型进行相应的处理,并通过设置replyTo字段将结果返回给Activity
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值