【问题标题】:Android sending periodically data from service to ActivityAndroid 定期从服务向 Activity 发送数据
【发布时间】:2011-10-15 15:01:36
【问题描述】:

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

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

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

所以第二点是最简单的。我坚持第 1 点。如何从服务定期向活动发送数据?我正在使用数据库来存储数据。

对此有什么帮助吗?

【问题讨论】:

    标签: android service android-activity


    【解决方案1】:
    • 您可以让您的服务向您的活动Messenger 发送“消息”,使其在服务检测到新内容时立即做出反应(请参阅this android developers help section 上的活动/服务消息传递)。

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

    您可以在 MessengerService.java(服务)和 MessengerServiceActivities.java(客户端)样本。

    这是相关部分。

    Activity 中的传入处理程序:

        /**
         * 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(这更难)。如果它在同一个包中,我建议你使用更简单的'local service binding'

    【讨论】:

    • 我的应用程序服务在同一个包中。即使使用信使,我也可以将消息从活动发送到服务。我需要从服务到活动的东西。可能不是定期调用某些方法。
    • @UmakantPatil 我将链接附加到活动 服务双向消息传递示例源。你会发现如何在那里实现 Service->Activity messenging。编码快乐!
    • @UmakantPatil 在答案中直接添加了样本的相关部分
    猜你喜欢
    • 2011-12-31
    • 2021-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-09
    • 1970-01-01
    • 2019-05-23
    相关资源
    最近更新 更多