这里重在谈谈我对几个常见概念的理解,至于他们的用法,网上多的很,这里就不赘述了。
/** * 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="{@docRoot}guide/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>
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会运行在主线程还是子线程?
优先级由高到低: 前台进程 > 可见进程 > 服务进程 > 后台进程 > 空进程