【问题标题】:Network Service needs to return a callback网络服务需要返回一个回调
【发布时间】:2011-04-21 16:25:21
【问题描述】:

我有一个网络服务,我想将其用作服务。它是一个本地服务,因为一旦应用程序进程停止并且没有其他应用程序需要访问它,它就不再有效。(或应该......)。

我正在考虑是否使用 IBinder 接口和对类的本地引用,并决定暂时不使用。

我有以下问题:

  1. 如果服务终止,并且我知道它可以在请求处理期间终止,这对我来说是个问题,首先我看到它,进程不会终止,直到网络请求返回(然后线程正常终止),除非 kill - 9用于过程......然后我不确定android对连接做了什么。我不确定我应该在这里采取什么方法。(即使这是一个本地线程而不是服务也是如此......)
  2. 如果我希望服务监听回调并在网络处理完成后调用它,我遇到了问题,无法使用 Intent 传递任何实例。所以我需要一些其他的解决方案,所有我认为对我来说听起来很糟糕的解决方案: A. 使用 IBinder 获取网络服务类的实例,然后我可以调用它的一个方法并传递一个实例,这将起作用,因为它们都是在同一个过程中运行,但需要我使用异步方式来获取一个不太适合我的网络实例。 B. 在我可以访问的服务中使用静态成员,那么我需要该服务做什么? C. 使用意图仅向服务发送参数,服务将从中组成一个请求并将其放入队列中,然后一旦完成将使用意图发送响应,该意图将封装响应(可能很长!)和还将包含调用类的名称作为字符串,因此所有接收器都会知道它是否适合他们 - 在 Intent 中封装数据并在所有接收器中搜索正确的接收器以获得响应的巨大开销。

我不想将该服务用作本地运行的简单线程,因为我担心如果我要在根活动中运行它,我将不得不使用静态容器,因此它在每个活动中都是可见的,如果根会因某种原因被销毁,它会带走所有服务,即使我开始新任务并且进程仍然存在......

有人对如何处理这件事有一些好主意吗?

【问题讨论】:

    标签: android static instance threadpool android-intent


    【解决方案1】:

    最终我放弃了这项服务。 不使用该服务的原因但是为了扩展 Application 对象并将网络类保留为该 Application 对象的成员,它在创建应用程序时启动,在创建任何活动之前,并在应用程序绘制它之前关闭它最后一口气。我知道应用程序 onTerminate 可能不会一直被调用,但是如果有人会在我的应用程序上调用 kill -9 或等效项,并且该进程将用它杀死应用程序,我已经准备好了,因为无论如何我的服务都会被破坏。 我放弃服务的原因是:

    1. 我有办法在应用程序生命周期中保持工作线程运行。
    2. 因为我有并且为了未来的规划将只有一个应用程序,它在未来仍然可以工作。
    3. 由于它没有连接并以任何特定 Activity 开始,因此不会受到他们的死亡或他们的创作的影响。
    4. 它有一个将贯穿应用程序生命周期的上下文,因此我可以使用它通过意图广播事件。
    5. 当应用程序终止时,我的服务也随之终止。除非 kill -9 然后系统将杀死与应用程序相关的所有线程,包括我的,所以我仍然很好。
    6. 每个活动都可以使用 getApplication() 并转换为我的 Application 对象并获取服务。

    因此,无需使用绑定并使我的代码复杂化,无需考虑如何启动或结束服务,如果我创建了一项服务,我很可能会从应用程序启动它(或根活动),所以我认为对我和我的应用来说这是最好的选择。

    【讨论】:

      猜你喜欢
      • 2013-11-19
      • 2012-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-25
      相关资源
      最近更新 更多