安卓如何从服务向活动定期发送数据

4
我有一个应用程序,在第一次启动时启动服务。之后,它会定期从服务器拉取数据。
  1. 我已经打开了我的活动,并且如果有刷新按钮,那么在后台已经获取数据的服务正在那个时候,我想禁用该按钮,并且当加载新数据时,必须在活动中显示它并启用刷新按钮。

  2. 如果活动未运行,则应显示通知。

所以第二点是最容易的,也完成了。 我卡在第1点上了。如何从服务定期向活动发送数据? 我正在使用数据库存储数据。
任何关于此的帮助?
1个回答

11
  • 您可以让服务向您的Messenger活动发送“消息”,以使其在服务检测到新内容时立即响应(请参见Activity/Service Messaging上的此android开发人员帮助部分)。

以下是双向消息传递(从服务到活动和从活动到服务)的示例。引用文档:

您可以在MessengerService.java(服务)和MessengerServiceActivities.java(客户端)示例中看到如何提供双向消息传递的示例。

以下是相关部分。

活动中的传入处理程序:

    /**
     * Activity Handler of incoming messages from service.
     */
    class IncomingHandler extends Handler {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case MessengerService.MSG_SET_VALUE:
                    mCallbackText.setText("Received from service: " + msg.arg1);
                    break;
                default:
                    super.handleMessage(msg);
            }
        }
    }

    /**
     * Activity target published for clients to send messages to IncomingHandler.
     */
    final Messenger mMessenger = new Messenger(new IncomingHandler());

在服务中,只显示相关部分:

/**
 * Handler of incoming messages from clients.
 */
class IncomingHandler extends Handler {
    @Override
    public void handleMessage(Message msg) {
        //obtain Activity address from Message
        Messenger mClient=msg.replyTo;
        try { 
        // try to send it some mValue
           mClient.send(Message.obtain(null,MSG_SET_VALUE, mValue, 0));
        } catch (RemoteException e) {
          // The client is dead.  Remove it
          mClient=null;
        }
    }
}

/**
 * Target we publish for clients to send messages to IncomingHandler.
 */
final Messenger mMessenger = new Messenger(new IncomingHandler());
  • 你也可以从你的活动中使用bind方法绑定到你的服务,并定期调用其中一个服务方法来检查新内容。如果你的服务是另一个应用程序,你必须使用aidl(这更困难)。如果它在同一个包中,建议您使用更容易的“本地服务绑定”。

我的应用程序服务在同一个包中。即使使用信使,我也可以从活动发送消息到服务。但是我需要从服务获取一些东西到活动中。除了定期调用某些方法之外,可能还需要其他的方法。 - Umakant Patil
@UmakantPatil 我附上了Activity <=> Service双向消息示例源代码的链接。你会发现如何实现Service->Activity消息传递。祝编码愉快! - Laurent'
@UmakantPatil在答案中直接添加了相关示例的部分 - Laurent'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接