通过绑定服务从服务到活动进行通信

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

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

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

活动代码:

//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:

 ArrayList mClients = new ArrayList(); 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); } } } 

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

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