Android定期将数据从服务发送到Activity

时间:2011-10-15 15:01:36

标签: android service android-activity

我有一个应用程序在第一次启动时启动服务。 之后,它会定期从服务器中提取数据。

  1. 我已经打开了我的活动,如果有刷新按钮,我已经有了已经在后台获取数据的服务,那时我想要禁用按钮,一旦加载了新数据,我必须显示它在活动中并启用刷新按钮。

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

  3. 所以第二点是最容易做到的。我坚持认为1.如何定期向服务中的活动发送数据?我正在使用数据库来存储数据。

    对此有何帮助?

1 个答案:

答案 0 :(得分:10)

  • 您可以让服务向您的活动Messenger发送“消息”,以便在服务检测到新内容后立即做出反应(请参阅有关活动/服务信息展示的this android developers help section)。

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

  

您可以看到如何在中提供双向消息传递的示例   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对您的服务进行{{1}},并定期致电您的某种服务方式以检查新内容。为此,如果您的服务是另一个应用程序,则必须使用aidl(这更难)。如果它在同一个包中,我建议您使用更简单的“local service binding