快捷搜索:  as  MTU2MjQ3NjQ4Mg`

Service详解_初识及启动服务实现

Service内容基础会涉及到,我们将环抱以下主要常识点进行阐发:

Service简单概述

Service在清单文件中的声明

Service生命周期

Service启动办事实现要领

1. Service简单概述

Service(办事)是一个一种可以在后台履行长光阴运行操作而没有用户界面的利用组件。用户无法感知它的存在。Service可由其他组件启动(如Activity),办事一旦被启动,将在后台不停运行,纵然办事的组件已经销毁也不受到影响。Service组件和Activity组件略有不合,Activity组件只有一种运行模式,即Activity处于启动状态,然则Service有两种状态:

启动状态

当利用组件(如Activity)经由过程调用startService()启动办事时,办事即处于启动状态。一旦启动,办事即可在后台无限日运行,纵然启动办事的组件已经销毁也不受到影响,除非手动调用才能竣事,已启动的办事平日是履行单一操作,不会将结果返回给调用方。

绑定状态

当利用组件经由过程调用bindService()绑定到办事时,办事即处于“绑定”状态。绑定办事供给一个客户端-办事端接口,容许组件与办事进行交互、发送哀求、获取结果,以致是进行进程间通信(IPC)跨进程履行这些操作。仅当与另一个利用组件绑准时,绑定办事才会运行。多个组件可以同时绑定该办事,但整个取消绑定后,办事即被销毁。

2. Service在清单文件中的声明

前面说过Service分为启动状态和绑定状态两种,但无论哪种详细的Service启动类型,都是经由过程承袭Service基类自定义而来,也都必要在AndroidManifest.xml中声明,那么在阐发这两种状态之前,我们先来懂得一下Service在AndroidManifest.xml中的声明语法,其款式如下:

. . .

android:exported:代表是否能被其他利用隐式调用,其默认值是由service中有无intent-filter抉择的,假如有intent-filter,默认值为true,否则为false。为false的环境下,纵然有intent-filter匹配,也无法打开,即无法被其他利用隐式调用。

android:name:对应Service类名

android:permission:是权限声明

android:process:是否必要在零丁的进程中运行,当设置为- android:process=”:remote”时,代表Service在零丁的进程中运行。留意“:”很紧张,它的意思是指要在当提高程名称前面附加上当前的包名,以是“remote”和”:remote”不是同一个意思,前者的进程名称为:remote,而后者的进程名称为:App-packageName:remote。

android:isolatedProcess :设置 true 意味着,办事会在一个特殊的进程下运行,这个进程与系统其他进程分开且没有自己的权限。与其通信的独一道路是经由过程办事的API(bind and start)。

android:enabled:是否可以被系统实例化,默觉得 true由于父标签 也有 enable 属性,以是必须两个都为默认值 true 的环境下办事才会被激活,否则不会激活。

3. Service生命周期

官方阐明图:

service_lifecycle.png

Service生命周期措施:

onBind()当另一个组件想经由过程调用 bindService() 与办事绑定(例如履行 RPC)时,系统将调用此措施。在此措施的实现中,必须返回 一个IBinder 接口的实现类,供客户端用来与办事进行通信。无论是启动状态照样绑定状态,此措施必须重写,但在启动状态的环境下直接返回 null。

onCreate() 首次创建办事时,系统将调用此措施来履行一次性设置法度榜样(在调onStartCommand() 或onBind() 之前)。假如办事已在运行,则不会调用此措施,该措施只调用一次。

onStartCommand(Intent intent, int flags, int startId) 当另一个组件(如 Activity)经由过程调用 startService() 哀求启动办事时,系统将调用此措施。一旦履行此措施,办事即会启动并可在后台无限日运行。 假如自己实现此措施,则必要在办事事情完成后,经由过程调用 stopSelf() 或 stopService() 来竣事办事。(在绑定状态下,无需实现此措施)

onDestroy() 当办事不再应用且将被销毁时,系统将调用此措施。办事应该实现此措施来清理所有资本,如线程、注册的侦听器、接管器等,这是办事接管的着末一个调用。

此中onStartCommand(Intent intent, int flags, int startId)措施对照紧张,这个措施有3个传入参数,它们的含义如下:

intent :启动时,启动组件通报过来的Intent,如Activity可使用Intent封装所必要的参数并通报给Service

flags:表示启动哀求时是否有额外数据,可选值有 0,START_FLAG_REDELIVERY,START_FLAG_RETRY,0代表没有,它们详细含义如下:

START_FLAG_REDELIVERY

这个值代表了onStartCommand措施的返回值为 START_REDELIVER_INTENT,而且在上一次办事被杀逝世前会去调用stopSelf措施竣事办事。此中START_REDELIVER_INTENT意味着当Service因内存不够而被系统kill后,则会重修办事,并经由过程通报给办事的着末一个 Intent 调用 onStartCommand(),此时Intent时有值的。

START_FLAG_RETRY

该flag代表当onStartCommand调用后不停没有返回值时,会考试测验从新去调用onStartCommand()。

startId: 指明当前办事的独一ID,与stopSelfResult (int startId)共同应用,stopSelfResult 可以更安然地根据ID竣事办事。

实际上onStartCommand的返回值int类型才是最最值得留意的,它有三种可选值:

START_STICKY

当Service因内存不够而被系统kill后,一段光阴后内存再次余暇时,系统将会考试测验从新创建此Service,一旦创建成功后将回调onStartCommand措施,但此中的Intent将是null,除非有挂起的Intent,如pendingintent,这个状态下对照适用于不履行敕令、但无限日运行并等待功课的媒体播放器或类似办事。

START_NOT_STICKY

当Service因内存不够而被系统kill后,纵然系统内存再次余暇时,系统也不会考试测验从新创建此Service。除非法度榜样中再次调用startService启动此Service,这是最安然的选项,可以避免在不需要时以及利用能够轻松重启所有未完成的功课时运行办事。

START_REDELIVER_INTENT

当Service因内存不够而被系统kill后,则会重修办事,并经由过程通报给办事的着末一个 Intent 调用 onStartCommand(),任何挂起 Intent均依次通报。与START_STICKY不合的是,此中的通报的Intent将长短空,是着末一次调用startService中的intent。这个值适用于主动履行应该急速规复的功课(例如下载文件)的办事。

因为每次启动办事(调用startService)时,onStartCommand措施都邑被调用,是以我们可以经由过程该措施应用Intent给Service通报所必要的参数,然后在onStartCommand措施中处置惩罚的事故,着末根据需求选择不合的Flag返回值,以达到对法度榜样更友好的节制

4. Service启动办事实现要领

4.1 应用步骤

步骤1:新建子类承袭Service类

需重写父类的onCreate()、onStartCommand()、onDestroy()和onBind()措施

步骤2:构建用于启动Service的Intent工具

步骤3:调用startService()启动Service、调用stopService()竣事办事

步骤4:在AndroidManifest.xml里注册Service

下面我们经由过程简单案例来实现并阐发:

class SimpleService : Service() {

/**

* 绑定办事(bindService)时调用

*/

override fun onBind(intent: Intent?): IBinder? = null

/**

* 首次创建办事时调用,系统调用此措施一次性预设法度榜样(在调用 onStartCommand() 或 onBind() 之前)

* 假如办事已在运行,则不会调用此措施。该措施只被调用一次

*/

override fun onCreate() {

super.onCreate()

System.out.println("OnCreate invoke")

}

/**

* 每次经由过程startService()措施启动Service时都邑被调用

*/

override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {

System.out.println("onStartCommand invoke")

return super.onStartCommand(intent, flags, startId)

}

/**

* 办事销毁时的调用

*/

override fun onDestroy() {

super.onDestroy()

System.out.println("onDestroy invoke")

}

}

从上面的代码我们可以看出SimpleService承袭了Service类,并重写了onBind措施,该措施是必须重写的,然则因为此时是启动状态的办事,则该措施无须实现,返回null即可,只有在绑定状态的环境下才必要实现该措施并返回一个IBinder的实现类。接着重写了onCreate、onStartCommand、onDestroy三个主要的生命周期措施,关于措施的先容,上面

您可能还会对下面的文章感兴趣: