Service、IntentService

IntentService

是service的子类,他会创建默认的工作线程,同时创建工作队列,逐一完成所有启动请求,不必担心多线程问题,onHandleIntent()处理启动任务。在处理完所有请求后会自动关闭服务。

在8.0已经弃用,用WorkManager或JobIntentService,它使用作业而不是服务。所以Android8.0及以上JobIntentService和JobService做的事情是相同的,都继承于service,都是等着JobScheduler分配任务来执行。不同点在于,JobService使用的handler使用的是主线程的Looper,因此需要在onStartJob()中手动创建AsyncTask去执行耗时任务,而JobIntentService则帮我们处理这一过程,使用它只需要写需要做的任务逻辑即可,不用关心卡住主线程的问题。

Service

面试语:
service是四大组件之一,通常在后台运行,默认情况下运行在主线程之中,但是也可以另行指定在其他进程中去运行,他不会自行创建线程,也不会独立在进程中运行。

service分为前台服务后台服务两种,后台服务是没有用户可交互界面的。例如网易云音乐在切换至后台后,通知栏会显示音乐播放的服务通知,这属于前台服务,这种服务及时在内存紧张的情况下系统也不会杀死该服务,优先级比较高。但是在9.0及以后的系统中必须申请权限才可以使用。后台服务是没有可见界面的,在Android8.0及以上应用变为后台为了保证前台应用的正常运行,会对后台服务作出限制。在应用进入后台后,会有一个几分钟的缓冲时间后台服务可以正常工作,当时间结束后系统会默认该应用处于空闲状态从而停止后台服务就像我们自己调用了stopSlef()。通常可以通过JobScheduler(工作计划来解决这些问题,但是在Android10.0后也会对此作出限制)来完成,但是他会尽可能的在时间允许范围内做任务的推迟。

service可以通过其他组件启动,比如Activity、广播。如果服务将执行任何耗时操作,则应通过在服务内创建新线程来完成这项工作。通过使用单独的线程,可以降低发生“应用无响应”(ANR) 错误的风险,而应用的主线程仍可继续专注于运行用户与 Activity 之间的交互。

服务和线程:

服务用在及时应用没有在前台与用户进行交互也要运行的时候,如果仅仅是想在进行交互的时候做一些别的操作应该通过线程去实现

Intent:

通过显式Intent来启动服务使,用隐式 Intent 启动服务存在安全隐患,因为您无法确定哪些服务会响应 Intent,而用户也无法看到哪些服务已启动。从 Android 5.0(API 级别 21)开始,如果使用隐式 Intent 调用,则系统会抛出异常。

生命周期:

onCreate():

首次创建服务时,系统将调用此方法。如果服务已在运行,则不会调用此方法,该方法只调用一次,重复启动不会调用。

  • 服务在没有启动的情况下直接绑定会运行OnCreate()和OnBind(),之后多次绑定不会再有方法调用,当绑定后再去启动服务只会运行onStartCommand()并不会再执行onCreate()和OnBind()。

onStartCommand():

代替已经过时的onStart()方法。
当另一个组件通过调用startService()请求启动服务时,系统将调用此方法。在此方法中会接收Intent。如果服务没有实现该方法,只做了绑定,服务只会在被其他组件绑定后运行,当所有绑定被取消后系统会将其销毁。

onDestroy():
当服务不再使用且将被销毁时,系统将调用此方法,在这个方法中做资源回收,如监听器、线程等。

onBind():
当另一个组件通过调用bindService()与服务绑定时,系统将调用此方法。

onUnbind():
当另一个组件通过调用unbindService()与服务解绑时,系统将调用此方法。

onRebind():
当旧的组件与服务解绑后,另一个新的组件与服务绑定,onUnbind()返回true时,系统将调用此方法。

在Service的生命周期里,常用的方法有:
手动调用的方法:
startService() 启动服务
stopService() 关闭服务
bindService() 绑定服务
unbindService() 解绑服务

自动调用的方法:
onCreat() 创建服务,只会在第一次启动时调用
onStartCommand() 开始服务,会在此方法中接收Intent
onDestroy() 销毁服务
onBind() 绑定服务
onUnbind() 解绑服务

  1. 生命周期调用
    1)启动Service服务
    单次:startService() —> onCreate() —> onStartCommand()
    多次:startService() —> onCreate() —> onStartCommand() —> onStartCommand()

2)停止Service服务
stopService() —> onDestroy()

3)绑定Service服务
bindService() —> onCreate() —> onBind()

4)解绑Service服务
unbindService() —> onUnbind() —> onDestroy()

5)启动绑定Service服务
startService() —> onCreate() —> onStartCommand() —> bindService() —> onBind()

6)解绑停止Service服务
unbindService() —> onUnbind() —> stopService() —> onDestroy()

7)解绑绑定Service服务
unbindService() —> onUnbind(ture) —> bindService() —> onRebind()

  • 服务可以通过bindService()直接启动,不需要先启动再绑定。
  • 服务多次被绑定只会执行一次。
  • 服务不能在未绑定的情况下执行解绑或者多次解绑,会报IllegalArgumentException异常。bindService有boolean返回。
  • 服务通过绑定启动后通过stopService()无法关闭服务或者解绑服务,对于绑定过的服务需要解绑才能关闭服务。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335

推荐阅读更多精彩内容