【问题标题】:Why use Service for background tasks?为什么将 Service 用于后台任务?
【发布时间】:2018-01-13 02:28:45
【问题描述】:

Activity 可以使用 AsyncTask 或 Handler 框架进行后台工作。即使在用户离开启动它们的活动并且调用了活动的 onDestroy 之后,两者都将继续工作。换句话说,即使在其 GUI 关闭后,Activity 也完全能够执行后台工作。

在这种情况下,将 Service 用于后台工作似乎是多余的。服务带来了什么活动不能做的事情?谢谢。

【问题讨论】:

    标签: android


    【解决方案1】:

    什么是服务?

    关于 Service 类的大部分困惑实际上都围绕着它不是什么:

    • 服务不是一个单独的进程。 Service 对象本身并不意味着它在自己的进程中运行;除非另有说明,否则它会在与其所属的应用程序相同的进程中运行。
    • 服务不是线程。它本身并不是一种脱离主线程工作的方法(以避免应用程序无响应错误)。

    因此,Service 本身其实很简单,主要提供两个功能:

    • 应用程序可以在后台告诉系统它想在后台执行的操作(即使用户没有直接与应用程序交互)。这对应于对 Context.startService() 的调用,它要求系统为服务安排工作,直到服务或其他人明确停止它为止。
    • 应用程序向其他应用程序公开其部分功能的工具。这对应于对 Context.bindService() 的调用,它允许与服务建立长期连接以便与之交互。

    Read the rest of the documentation for more info

    因此,服务的一个实例是您希望在设定的时间间隔内自行发生的事情,而无需启动活动或其他任何事情来“启动”它。例如,SMSBackup 只是一个在后台运行的服务,每 X 分钟轮询一次您的 SMS 消息并将它们复制到 gmail 标签中,作为“备份”服务。

    【讨论】:

    • 向其他应用程序公开非可视功能是对服务的合法使用。这不是这里的问题。但是,计划的后台工作是一个很好的用例,最好从服务中完成。
    • 你@BryanDenny 的意思是我需要在我的服务类中启动一个新的线程来执行网络或数据库操作?正确的?可能是这样Thread thread = new Thread() { @Override public void run() { try { while(true) { // network operation } } catch (InterruptedException e) { e.printStackTrace(); } } }; thread.start();还是使用AsyncTask?
    • @BryanDenny here is my question。欢迎提供一些帮助。
    【解决方案2】:

    当Activity显示的UI进入后台时(按home键),并不能保证Activity存在很长时间,框架可能会决定停止它。

    【讨论】:

    • 我想,与调用 onDestroy 的活动相比,未调用 stopService(以及因此 onDestroy)的服务被杀死的可能性要小得多。
    【解决方案3】:

    AsyncTask 允许您轻松执行 UI 更新,同时还可以清楚地分离 UI 线程和工作线程逻辑。但是,其他应用程序将无法访问您的 AsyncTask。在这种情况下,您需要这些服务。

    【讨论】:

      【解决方案4】:

      @BraynDenny 的回答已经够好了,我想换个角度解释一下。

      首先你误解了后台任务的含义,服务的定义是即使应用程序不在前台,服务也会在后台持续运行,这里的后台不是指单独的线程,而是指与 Activity 不同,服务在您关闭应用程序时运行,默认情况下服务也在主线程中运行,如果您想要 异步服务使用 intentService

      一个活动完全有能力做后台工作,即使在它完成之后 GUI 已关闭。

      你所说的绝对是错误的。 Activity、Service 是 Android 的组件,但 AsyncTasks 或 Threads 不是组件 当您杀死一个活动时,该活动中的 Asynctask 也会被杀死,因为 Asynctask 实例是在活动类中创建的,但是当您开始使用 前台服务下载文件时,即使您关闭应用程序,就像Android中的音乐应用程序一样,即使您关闭应用程序,音乐仍然在后台播放,并显示前台通知

      共有三种不同类型的服务,要了解更多信息,请查看此链接https://developer.android.com/guide/components/services.html#CreatingBoundService

      【讨论】:

        猜你喜欢
        • 2019-07-19
        • 2020-09-21
        • 2020-06-22
        • 2020-02-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多