如果它在android

时间:2015-05-19 04:42:57

标签: android service binding

我在Android Developer网站上浏览了Bound Service。我以为我理解了这项服务,但我刚刚找到了另一种通过使用Messenger类来连接服务的方法,特别是对于本地服务。在那里我感到困惑。也许我认为这个概念不对。

以下是我对Android Service的理解。您在

时创建服务
  1. 您想在背景中执行单独的工作。
  2. 您希望将其设为一个单独的流程。
  3. 您希望让它在与启动它的组件无关的生命周期中运行。
  4. 混淆是列表中的第一项,即背景的定义。不是线程或进程的背景吗?我从未想过它可以在主线程上运行。

    以下是开发页面中关于服务的注意事项。

      

    警告:服务在其托管进程的主线程中运行 - 该服务不会创建自己的线程,也不会在单独的进程中运行(除非您另行指定)。这意味着,如果您的服务要进行任何CPU密集型工作或阻止操作(例如MP3播放或网络),您应该在服务中创建一个新线程来完成这项工作。通过使用单独的线程,您将降低应用程序无响应(ANR)错误的风险,并且应用程序的主线程可以保持专用于用户与您的活动的交互。

    问题

    1. 如果服务功能无论如何都要在主线程上运行,为什么选择使用服务?
    2. 即使在主线程中完成耗时的工作,我们是否还必须编写一个服务来阻止ANR?假设该服务仅适用于我的应用程序。
    3. 是否有任何实际案例或理由将服务用作私有服务并在同一个线程中运行?

3 个答案:

答案 0 :(得分:27)

应用程序主线程并不总是UI线程。例如,当Activity停止时,将调用onStop(),因此UI线程将从Activity中删除并移至相同或不同应用程序中的另一个Activity。但是,它并不意味着应用程序不再处于活动状态,它可以在后台继续工作,直到它被OS或用户关闭。然后谁让它在后台运行?它是主线程,而不是UI线程。

什么是服务

  

在Android中,服务是可以执行的应用程序组件   UI线程后台长时间运行的操作。通过   背景,这意味着它没有用户界面。一项服务   默认情况下,在调用Component的进程的主线程上运行   (因此可以降低响应性并导致ANR),因此您   应创建一个新线程来执行长时间运行的操作。一个   服务也可以在完全不同的过程中运行。

     

与活动组件不同,服务没有任何图形   接口。广播接收器也用于接收广播   消息(广播,多播,单播)和执行短任务   而服务则意味着像流式传输那样进行冗长的处理   音乐,网络交易,文件I / O,与数据库交互等   当服务由活动等应用程序组件启动时   它在后台运行,即使用户切换也会继续运行   到另一个应用程序或起始组件本身被销毁

为何使用服务

  

服务的优先级高于其他后台进程和   因此Android不太可能终止它。虽然可以   配置为在有足够资源可用时重新启动   再次。你应该经历不同的过程和他们的   关于流程和文件的文件中的优先级/重要级别   线程。为它们分配与前台活动相同的优先级是   绝对有可能在这种情况下,它需要有一个可见的   通知激活(通常用于服务播放音乐)。

如果您不想自己管理线程,请使用IntentService。否则,请使用AsyncTasks

请将此优秀文章发送至understand more in detail以及read this answer

答案 1 :(得分:0)

服务基本上在UI线程或主线程中运行。但是,如果要在服务中执行长时间运行的操作,则需要创建一个后台线程并执行该任务。

但是为什么我们必须使用服务?

现在让我们考虑一下音乐应用程序。即使离开音乐应用程序,我们也需要连续播放歌曲。如果使用活动,我们将无法达到上述要求。因此,服务在这种情况下会有所帮助。即使应用程序不在前台,服务仍可以继续运行,并且我们能够听歌。这就是为什么即使服务在主线程上运行,我们仍要使用服务的原因。

答案 2 :(得分:-2)

简而言之,服务在UI线程的背景下运行。 您可以执行客户端 - 服务器身份验证等任务,也可以写入数据库,其中任务在后台完成,没有图形界面。

但如果您正在执行可能冻结接口的非常长的处理任务,则可以在单独的线程上使用服务。

例如,单独线程上的服务是IntentService