远程服务如何向绑定的活动发送消息?

2023-12-30

我读过有关绑定服务的文档 http://developer.android.com/guide/topics/fundamentals/bound-services.html,其中表明您可以通过以下方式轻松沟通Messages从活动到远程(即不在同一上下文中)服务,但是有什么方法可以从活动发送消息Service to the 绑定活动?例如,我的活动绑定到同一应用程序的正在运行的后台服务,向其发送一条消息,收到此消息后,服务会向该活动回复一条消息。我该如何实现这一点?您能给我指出一些解释该主题的文档吗?


注意:这仅适用于正在进行的服务和活动,不适用于远程提问。

使用服务与活动进行通信涉及创建一个侦听器,您可以将其从活动传递给服务。

您需要创建一个与活动绑定的服务。

第一步是提供服务。在服务中确保您有一个 Binder 对象和返回 Binder 对象的方法。下面是我在服务中用于检索活页夹的示例。另请注意,此绑定器有一个设置侦听器的方法,该侦听器将作为 BoundServiceListener 类型字段保存在服务中。

/**
 * Class used for the client Binder.  Because we know this service always
 * runs in the same process as its clients, we don't need to deal with IPC.
 */
public class DownloadBgBinder extends Binder {

    public DownloadBgService getService() {
        // Return this instance of LocalService so clients can call public methods
        return DownloadBgService.this;
    }

    public void setListener(BoundServiceListener listener) {
        mListener = listener;
    }
}

@Override
public IBinder onBind(Intent intent) {
    return mBinder;
}

现在您需要创建某种可以传递给服务可以用来向其发送更新的活页夹对象的接口。下面是我的 BoundServiceListener。

public interface BoundServiceListener {

    public void sendProgress(double progress);
    public void finishedDownloading();
}

现在,在您的活动中,您需要创建一个用于绑定到服务的服务连接对象。添加这样的东西。

/** Defines callbacks for service binding, passed to bindService() */
private ServiceConnection mConnection = new ServiceConnection() {

    @Override
    public void onServiceDisconnected(ComponentName arg0) {
        mBound = false;
    }

    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        // We've bound to LocalService, cast the IBinder and get LocalService instance
        DownloadBgBinder binder = (DownloadBgBinder) service;
        mService = binder.getService();
        binder.setListener(new BoundServiceListener() {

            @Override
            public void sendProgress(double progress) {
                // Use this method to update our download progress
            }

            @Override
            public void finishedDownloading() {

            }   
        });

        mBound = true;
    }

现在要注意的关键是

binder.setListener(new BoundServiceListener() {

    @Override
    public void sendProgress(double progress) {
        // Use this method to update our download progress
    }

    @Override
    public void finishedDownloading() {

    }
});

这部分是我实际将 BoundServiceListener 接口发送到服务类的地方。然后服务类在此处使用该侦听器对象

    if (mListener!=null)
        mListener.finishedDownloading();
    if (mListener!=null)
        mListener.sendProgress(percent);

现在,您可以将其放在服务类中所需的任何位置,并且您的活动将收到进度更新。

另请务必在您的活动中包含以下内容以实际绑定和启动服务。

Intent intent = new Intent(this, DownloadBgService.class);
startService(intent);
bindService(intent, mConnection, Context.BIND_AUTO_CREATE);

请记住,即使您绑定到服务,它也不会真正启动,直到您调用启动服务。绑定到服务只是将服务连接到活动。 startService() 方法调用服务

onStartCommand(Intent intent, int flags, int startId)

还要在清单中声明您的服务

<service android:name=".services.DownloadBgService" />

当活动结束时也解绑服务

@Override
protected void onStop() {
    super.onStop();
    // Unbind from the service
    if (mBound) {
        unbindService(mConnection);
        mBound = false;
    }
}

希望这可以帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

远程服务如何向绑定的活动发送消息? 的相关文章

随机推荐

  • erlang中的双向链接数据结构

    嗨 我想制作一棵树 在父母和孩子之间保留双向引用 但这似乎不可能实现 因为当我创建第一个对象时 我没有另一个对象 因此无法引用它 这是一些示例代码 record node name children root main gt A node
  • Scala 中其他实例的受保护成员

    我在学习Scala的过程中遇到了一个困难 我有一个继承层次结构 本质上与此等效 class A protected def myMethod println myMethod from A class B extends A def inv
  • 使用 Catch2 时未解决的外部符号错误

    我正在尝试在 Visual Studio 中进行 Catch2 单元测试 我创建了一个小测试项目来练习 当我尝试编译此测试项目时 出现链接器错误 我现在正在尝试诊断此链接器错误 但是Catch2 hpp头文件包含数千行代码 我希望更熟悉 C
  • Cocoa Touch 相当于 NSArrayController 吗?

    开始稍微使用 Core Data 虽然我已经弄清楚如何在常规 Cocoa 应用程序中使用它 但它在 Cocoa Touch 中的工作方式似乎有点不同 如何将实体绑定到对象 例如 Cocoa Touch 中的表格单元格 不幸的是 iPhone
  • Lua 中的 for...in 是什么意思?

    我正在玩下面的代码并感到困惑 function square iteratorMaxCount currentNumber if currentNumber
  • MVC3起始页

    我正在 Visual Studio 2010 中开发一个 Web 应用程序 它的 mvc3 我试图弄清楚如何发布它 并通过各种说明我尝试将视图 主页 索引设置为起始页 这是一个坏主意 现在没有任何效果 即使尝试像我一样查看该站点 使用 F5
  • 单元测试时如何将控制器注入指令中

    我想测试这样声明的 AngularJS 指令 app directive myCustomer function return template cust html controller customerController 在测试中 我想
  • Junit @BeforeClass 和 @AfterClass 在多个测试用例的情况下的行为

    Folks 假设我有一个定期运行的复杂的子类测试套件 作为其中的一部分 我试图确保每个测试类严格地一个接一个地执行 并且Test2 s BeforeClass方法之前不会启动Test1 s AfterClass已经完成了 这是一个有效的假设
  • 在 Windows 窗体中运行 WCF

    我有一个程序作为客户端和服务器工作 我将 wcf 服务与 BasicHttpBinding 结合使用 并且该程序在控制台应用程序中运行 当我将代码移至 Windows 窗体应用程序时 一切都停止工作 当客户端调用一个操作时 它不会返回 当调
  • 原子函数真的会让 CUDA 中的变量变得不稳定吗?

    我写了一个非常简单的代码 要求线程 0 更新全局变量 而其他线程继续读取该变量 但我发现其他线程并没有真正获取该值 代码在这里 很简单 谁能给我任何建议如何解决它 多谢 global void addKernel int c int i t
  • 将 .ui 文件转换为 .py 文件时出错

    我在 Qt4 Designer 中创建了 notepad ui 文件 并尝试通过命令创建 notepadwindow py 文件 pyuic4 bat notepad ui o notepadwindow py 结果我得到了以下错误 Tra
  • Servlet 上的全局变量。是对所有会话全局的,还是仅对当前会话全局的? [复制]

    这个问题在这里已经有答案了 我需要在应用程序运行时共享信息 如果我有 public class example extends HttpServlet Object globalObject doGet doPost 用户通过服务器和对象全
  • 无法将 float 转换为 int if 对象

    这段代码运行良好 float ff 5 5f int fd int ff Console Write fd 哪里有这个代码没有 float ff 5 5f object jf ff int fd int jf Console Write f
  • 使用 PyGObject 中的 GtkSourceView 从 Glade 加载 GUI

    我正在尝试使用 PyGObject 中具有 GtkSourceView 小部件的 Glade 文件 我写了一个关于如何开始在 Glade 中使用新的 GtkSourceView 3 0 的小指南 http cjenkins wordpres
  • 使用java更新ArrayList/HashMap中的元素

    我正在为大学做一些课程 我真的应该知道这一点 但我不确定如何更新存储在 HashMap 中的对象 我有一个抽象的 用户 类 它扩展到 客户 和 员工 类 其实例存储在名为 mapUsers 的 HashMap 中 我认为可以完成的方法是将要
  • DynamoDB 物化图模式示例

    我开始研究 DynamoDB 但在阅读有关物化图模式的部分时遇到了困难 管理多对多关系的最佳实践 https docs aws amazon com amazondynamodb latest developerguide bp adjac
  • 聚合函数上的 iOS FetchRequest:如何包含挂起的更改?

    我终于至少缩小了这个问题的范围 我正在计算支出的一些聚合函数 如本例中的总和 如果我更改一些支出 此聚合提取不会立即刷新 而是在一段时间后刷新 可能是在更改保存到数据库之后 我在文档中找到了这部分 void setIncludesPendi
  • 迭代器的类型:输出、输入、正向、随机访问迭代器

    C STL 中有多少种类型的迭代器 到目前为止 我所知道的有这些 输出迭代器 输入迭代器 前向迭代器 随机访问迭代器 还有更多吗 它们之间有什么区别 各自的局限性和特点是什么 什么时候使用哪种类型 如果可以的话 找到并阅读 C 标准库 教程
  • 带有 x86 映像的 Android 2.3.3 模拟器无法通过“使用主机 GPU”运行

    我注意到 如果我在使用 Android 2 3 3 和 Intel x86 系统映像创建新的虚拟设备时选中 使用主机 GPU 复选框 模拟器将无法运行 它会显示黑屏 没有任何生命迹象 除了logcat 中的错误 根据我在网上找到的一些信息
  • 远程服务如何向绑定的活动发送消息?

    我读过有关绑定服务的文档 http developer android com guide topics fundamentals bound services html 其中表明您可以通过以下方式轻松沟通Messages从活动到远程 即不