Android Service(服务)/进程/线程—服务(Service)
Posted herdyouth
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android Service(服务)/进程/线程—服务(Service)相关的知识,希望对你有一定的参考价值。
这里重在谈谈我对几个常见概念的理解,至于他们的用法,网上多的很,这里就不赘述了。
1. 官网介绍
- 先来看看官方的说法:
(1) Service介绍 https://developer.android.com/guide/components/services
(2) Service的xml属性 https://developer.android.com/guide/topics/manifest/service-element - 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 是一种可在后台执行长时间运行操作而不提供界面的应用组件。
-
Android Service是组件,既不能说它是单独的进程也不能说它是单独的线程。
如果非要从通俗的语言层面来理解的话,姑且将其理解为对象。这个Service对象本身作为应用程序的一部分与它的调用者运行在相同的进程,当然如果指定了process则会运行到另外的进程。指定到其他进程的方法参加Service属性的"android:process"。 -
Android Service可以在后台运行,不需要给用户提供任何的界面。但是Service是默认运行在主线程的,不要以为可以直接把它放在后台作耗时操作,如果要做耗时操作还是需要在Service里另起线程的,否则你懂得,会阻塞主线程造成ANR。
Q:那么问题来了:既然Service不能方便我们做后台耗时操作,要它何用,直接用线程不久可以替代了吗?
A:提高它所在进程的优先级,尽量避免系统内存不足时被优先清除了。 (这里在文末会扩展说两句Android进程优先级)。
举个栗子:比如后台播放音乐,那么音乐播放器就是个后台进程,后台进程是容易被系统回收的,这样就可能出现听一会儿音乐突然没了,然后又要去重新打开播放器,但是如果音乐播放器开启了服务(记得新建线程哟)去播放音乐,后台播放器就不会那么容易被杀了。
至此应该就厘清了Service/线程/进程的关系。本文的主题已经聊完了,下一篇将会聊聊Service服务类型与IPC通信。
小结下本文的几点内容:
- Service是组件:默认运行在当前进程的主线程中的,如果需要执行耗时操作,记得在Service里创建新线程;
- Service用来提高优先级:在后台场景下,Service的优先级是高于后台挂起的Activity的,也高于Activity所创建的线程。这样的话,在内存不足时,Service不会被优先杀死。
Q:这里留个问题:Service可以在任何线程启动,那么当Service在子线程启动时,Service会运行在主线程还是子线程?
3. Android进程优先级
优先级由高到低: 前台进程 > 可见进程 > 服务进程 > 后台进程 > 空进程
以上是关于Android Service(服务)/进程/线程—服务(Service)的主要内容,如果未能解决你的问题,请参考以下文章
Android Service(服务)/进程/线程—服务(Service)