通过绑定服务从服务到活动进行通信 [英] Communicate from Service to Activity via bound service

查看:113
本文介绍了通过绑定服务从服务到活动进行通信的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

本教程后我已将活动绑定到我的服务。
http://developer.android.com/guide/components/bound -services.html

I've already bound an activity to my service following this tutorial. http://developer.android.com/guide/components/bound-services.html

我可以调用服务函数,但是如果我想要更改一些文本视图或禁用某些文本视图切换按钮是因为在服务(以及服务)上完成的工作。是否有一种简单的方法可以做到这一点?

I'm able to call service functions, but what if I want to for example, change some of my textviews or disable some of the toggle buttons because of work done on the service (and from the service). Would there be an easy to way to do this?

推荐答案

您可以使用消息在活动和服务之间发送信息。这是发送简单数据的简便方法,但如果您需要非常频繁地发送数据或发送复杂数据,则可能不是最佳选择。这是我的一个应用程序中的一些代码示例,其中包含一项服务和一项通信活动:

You can use messages to send information between activities and services. This is an easy way to send simple data, but may not be the best option if you need to send data very frequently, or send complicated data. This is an example of some code I have in one of my apps with a service and an activity which communicate:

活动中的代码:

//this is where you set what you want to happen
class IncomingHandler extends Handler {
    @Override
    public void handleMessage(Message msg) {
        switch (msg.what) {
            //this switch reads the information in the message (usually just 
            //an integer) and will do something depending on which integer is sent
            case 1: do_something();
            case 2: do_something_2(); //etc.
            default:
                super.handleMessage(msg);
        }
    }
}

final Messenger myMessenger = new Messenger(new IncomingHandler());

private ServiceConnection mConnection = new ServiceConnection() {
    public void onServiceConnected(ComponentName className,
            IBinder service) {
        myService = new Messenger(service);
        myCallbackText = (TextView)findViewById(R.id.tv01); //This is a text view which will display status information as needed
        myCallbackText.setText("Attached.");

        try {
            Message msg = Message.obtain(null,
                    1);
            msg.replyTo = mMessenger; //here we send an instance of our messenger implementation as the replyTo address
            mService.send(msg);

            msg = Message.obtain(null,
                    3, this.hashCode(), 0);
            mService.send(msg); //send a message with the value "3"
        } catch (RemoteException e) {
          //nothing you can do if the server isn't active
        }

        Toast.makeText(Service_testActivity.this, R.string.remote_service_connected,
                Toast.LENGTH_SHORT).show();//confirmation that the connection happened successfully
    }

    public void onServiceDisconnected(ComponentName className) {
        // This is called when the connection with the service has been
        // unexpectedly disconnected -- that is, its process crashed.
        mService = null;
        mCallbackText = (TextView)findViewById(R.id.tv01);//same textview as before
        mCallbackText.setText("Disconnected.");

        Toast.makeText(Service_testActivity.this, R.string.remote_service_disconnected,
                Toast.LENGTH_SHORT).show();
    }
};



服务中的代码:
在服务中,您需要拥有代码(非常类似于活动中的代码)来接收消息并将 msg.replyTo 字段保存为 Messenger 对象。有一个例子可以让你创建一个对象,然后像这样使用IncomingHandler:



Code in the service: In the service, you will want to have code (very similar to the code in the activity) to receive a message and save the msg.replyTo field as a Messenger object. There is an example somewhere which will have you make an object and then use an IncomingHandler like this:

ArrayList<Messenger> mClients = new ArrayList<Messenger>();
class IncomingHandler extends Handler {
    @Override
    public void handleMessage(Message msg) {
        switch (msg.what) {
            case MSG_REGISTER_CLIENT:
                mClients.add(msg.replyTo);
                break;
            case MSG_UNREGISTER_CLIENT:
                mClients.remove(msg.replyTo);
                break;
            default:
                super.handleMessage(msg);
        }
    }
}

这可以让您的服务一次跟踪多个客户端并将消息发送到指定的客户端。要发送消息,只需使用以下内容:

This can allow your service to keep track of multiple clients at once and send messages to specified clients. To send a message simply use something like this:

mClients.get(1).send(Message.obtain(null, 3, new Random().nextInt(), 0));
//sends a message to the first client saved in the list

这篇关于通过绑定服务从服务到活动进行通信的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆