Service学习笔记01-启动方式与生命周期
Posted 双木青橙
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Service学习笔记01-启动方式与生命周期相关的知识,希望对你有一定的参考价值。
0 系列汇总
- Service学习笔记01-启动方式与生命周期
- Service学习笔记02-实战 startService 与bindService
- Service学习笔记03- 前台服务实战
- Service学习笔记04- 其他服务实现方式与替代方式
1 Service的使用场景
Service 是一种可在后台执行长时间运行操作而不提供界面的应用组件,服务可由其他应用组件启动,而且即使用户切换到其他应用,**服务仍将在后台继续运行。**此外,组件可通过绑定到服务与之进行交互,甚至是执行了进程间通信(IPC)。
以下是三种不同不同的服务类型。
-
前台
前台服务执行一些用户能注意到的操作。例如,音频应用会使用前台服务来播放音频曲目。前台服务必须显示通知。即使用户停止与应用的交互,前台服务仍会继续运行。 -
后台
后台服务执行用户不会直接注意到的操作。例如,如果应用使用某个服务来压缩其存储空间,则此服务通常是后台服务 -
绑定
当应用组件通过调用bindService()
绑定到服务时,服务处于绑定状态,绑定服务会提供C/S接口,以便组件与服务进行交互、发送请求、接收结果,甚至是利用进程间通信(IPC)跨进程执行这些操作。仅当与另一个应用组件绑定时,绑定服务才会运行。多个组件可同时绑定到服务,但是要全部取消绑定后,该服务即会被销毁。
2 Service的两种启动方式
无论是startService
还是bindService
都是通过Intent来显式指定,且不要为服务声明Intent 过滤器。使用隐式Intent启动服务存在安全隐患,因为您无法确定哪些服务会影响Intent,而用户也无法看到哪些服务已启动。从android 5.0 (API 21)开始,如果使用隐式Intent调用bindService()
,则系统会抛出异常。
Service 必须在AndroidManifest清单文件中定义,系统不会识别和运行任何未声明的服务。完整的可参考,android:name
属于是唯一必需的属性,用于指定服务的类名。发布应用后,请确保此类名不变,以避免因依赖显式Intent来启动或者绑定服务不可用的风险。
一个典型的Service见如下所示:
- android:name
实现服务的 Service 子类的名称。此名称应该是一个完全限定类名称,如(“com.example.project.RoomService”)。不过,作为一种简写形式,如果名称的第一个字符是句点,(如“.RoomService”),则会将其附加到 元素中指定的软件包名称(不建议采用此方式)。发布应用后,不能更改此名称(除非您已设置 android:exported=“false”),且修改后将应用调用处也同步修改。 - android:process
将运行服务的进程的名称。通常,应用的所有组件都会在为应用创建的默认进程中运行。它与应用软件包的名称相同。 元素的 process 属性可以为所有组件设置不同的默认值。即只有需要另起一个进程运行引服务时,通过以冒号(:)开头的名称指定一个新进程的名称,否则process属性不需要定义 - android:exported
如果为true,则表示其他应用的组件可以调用服务或者与之交互。建立如果明确不需要提供给其他三方应用使用,则务必将其置为false
<service
android:name="com.hl.bindertest.service.LocalService"
android:exported="false"
android:process=":DaemonService"/>
2.1 通过startService()
启动服务
2.2 通过binService()
绑定
3 Service 的回调方法与生命周期
- 说明:
- Service 是系统生成的天然的单例,如果
onCreate()
方法只会执行一次,如果Service已经被启动,onCreate()
不会再被调用
以上是关于Service学习笔记01-启动方式与生命周期的主要内容,如果未能解决你的问题,请参考以下文章
Service学习笔记02-实战 startService 与bindService