Android Service(服务)/进程/线程—服务(Service)

Posted Chris_166

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android Service(服务)/进程/线程—服务(Service)相关的知识,希望对你有一定的参考价值。

这里重在谈谈我对几个常见概念的理解,至于他们的用法,网上多的很,这里就不赘述了。

1. 官网介绍

  1. 先来看看官方的说法:
    (1) Service介绍 https://developer.android.com/guide/components/services
    (2) Service的xml属性 https://developer.android.com/guide/topics/manifest/service-element
  2. Source Code说明
    frameworks/base/core/java/android/app/Service.java
/**
 * A Service is an application component representing either an application's desire
 * to perform a longer-running operation while not interacting with the user
 * or to supply functionality for other applications to use.  Each service
 * class must have a corresponding
 * @link android.R.styleable#AndroidManifestService <service>
 * declaration in its package's <code>AndroidManifest.xml</code>.  Services
 * can be started with
 * @link android.content.Context#startService Context.startService() and
 * @link android.content.Context#bindService Context.bindService().
 * 
 * <p>Note that services, like other application objects, run in the main
 * thread of their hosting process.  This means that, if your service is going
 * to do any CPU intensive (such as MP3 playback) or blocking (such as
 * networking) operations, it should spawn its own thread in which to do that
 * work.  More information on this can be found in
 * <a href="@docRootguide/topics/fundamentals/processes-and-threads.html">Processes and
 * Threads</a>.  The @link androidx.core.app.JobIntentService class is available
 * as a standard implementation of Service that has its own thread where it
 * schedules its work to be done.</p>

2. 解读

Service 是一种可在后台执行长时间运行操作而不提供界面的应用组件。

  1. Android Service是组件,既不能说它是单独的进程也不能说它是单独的线程。
    如果非要从通俗的语言层面来理解的话,姑且将其理解为对象。这个Service对象本身作为应用程序的一部分与它的调用者运行在相同的进程,当然如果指定了process则会运行到另外的进程。指定到其他进程的方法参加Service属性的"android:process"。

  2. Android Service可以在后台运行,不需要给用户提供任何的界面。但是Service是默认运行在主线程的,不要以为可以直接把它放在后台作耗时操作,如果要做耗时操作还是需要在Service里另起线程的,否则你懂得,会阻塞主线程造成ANR。

Q:那么问题来了:既然Service不能方便我们做后台耗时操作,要它何用,直接用线程不久可以替代了吗
A:提高它所在进程的优先级,尽量避免系统内存不足时被优先清除了。 (这里在文末会扩展说两句Android进程优先级)。
举个栗子:比如后台播放音乐,那么音乐播放器就是个后台进程,后台进程是容易被系统回收的,这样就可能出现听一会儿音乐突然没了,然后又要去重新打开播放器,但是如果音乐播放器开启了服务(记得新建线程哟)去播放音乐,后台播放器就不会那么容易被杀了。

至此应该就厘清了Service/线程/进程的关系。本文的主题已经聊完了,下一篇将会聊聊Service服务类型与IPC通信。

小结下本文的几点内容:

  1. Service是组件:默认运行在当前进程的主线程中的,如果需要执行耗时操作,记得在Service里创建新线程;
  2. Service用来提高优先级:在后台场景下,Service的优先级是高于后台挂起的Activity的,也高于Activity所创建的线程。这样的话,在内存不足时,Service不会被优先杀死。
Q:这里留个问题:Service可以在任何线程启动,那么当Service在子线程启动时,Service会运行在主线程还是子线程?

3. Android进程优先级

优先级由高到低: 前台进程 > 可见进程 > 服务进程 > 后台进程 > 空进程

以上是关于Android Service(服务)/进程/线程—服务(Service)的主要内容,如果未能解决你的问题,请参考以下文章

Android Service(服务)/进程/线程—服务(Service)

Service服务-Android

android进程优先级

android:当Activity和Service 都被销毁后,如何控制其中生成的线程?

Android中怎么启动关闭Service及功能解释

Android 之 Service(一)启动,绑定服务