Android 定期从服务向 Activity 发送数据

标签 android service android-activity

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

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

  2. 如果 Activity 没有运行,那么它应该显示通知。

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

有什么帮助吗?

最佳答案

  • 您可以让您的服务向您的 Activity Messenger 发送“消息”,使其在服务检测到新内容时立即使用react(请参阅 this android developers help section 关于 Activity/Service Messenging)。

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

You can see an example of how to provide two-way messaging in the MessengerService.java (service) and MessengerServiceActivities.java (client) samples.

这是相关部分。

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());
  • 您还可以从您的 Activity 绑定(bind)到您的服务,并定期调用您的服务方法之一来检查新内容。为此,如果您的服务是另一个应用程序,您必须使用aidl(这更难)。如果它在同一个包中,我建议您使用更简单的 ' local service binding '

关于Android 定期从服务向 Activity 发送数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7778596/

相关文章:

java - android java 会在 java 8 中支持 lambda 表达式吗?

Android keystore 文件

android - 将 maven-release-plugin 添加到 Android Studio

android - 如何自动重启被杀死的服务?

android - 如何在 Android 中添加第二个 Activity

android - 设置多个 SharedPreferences 实例/文件的默认值

android - 如何找到我可以从其他程序使用哪些 Activity 或服务

java - 无法从 View 转换到 EditText

android - 从 Android Wear 向手机上的后台服务发送消息

azure - 以编程方式更新 Azure 云服务的 cscfg