Service相关
2021-12-26 本文已影响0人
Infinity_空
-
启动Service的方法有哪些?它们的区别在哪?有哪些使用场景?
- 生命周期:
- startService:onCreate->onStartCommand->onDestory,如果没有执行stopService,Service会一直在后台运行。
- bindService:onCreate->onBind-onUnbind->onDestory,执行bindService之后,service会和client绑定在一起,如果client销毁了,那么对应的service也会被停止。但是在client销毁时需要主动调用unbindService,否则会出现内存泄漏。
- 多次调用startService,service只会被创建一次,onCreate只会回调一次,但是onStartCommand每次都会被调用。
- 多次调用bindService,onCreate和onBind都只会回调一次,不会被多次创建和绑定。
- 交互:
- startService跟调用者不能进行交互,是独立且长期存在的
- bindService跟调用者绑定,可以与调用者进行交互,与调用者的生命周期绑定
- 使用场景:
- 需要下载一个大文件,或者后台播放音乐视频时,activity不需要与service交互,那么就使用startService
- 如果在音乐或者视频播放过程中,需要获取一些信息,此时可以用过bindService与服务绑定,进行一些交互
- 生命周期:
-
如果一个service既被startService又被bindService会有什么情况?
不管是startService还是bindService,onCreate只会调用一次,即service只会被创建一次。每调用一次startService,onStartCommand就会被调用一次。此后,如果要关闭service,需要同时调用stopService和unbindService(或者是客户端关闭),否则这个service不会被停止。 -
Service如何保活
- 启动多个service互相拉起
- 监听系统广播或者是三方应用广播(微信、支付宝等)进行唤醒
- 利用账号同步机制拉活
- 提高service的优先级,延长被kill的时间
- 利用像素为1的Activity,监听解锁屏和截屏的广播
- JobScheduler唤醒Service,Android7.0失效(因为如果没有启动前台服务,则会抛出IllegalStateException)
-
IntentService:IntentService继承于Service,默认开启一个工作线程,不断接收Intent执行任务,每次只执行一个任务,执行完毕之后,再执行下一个任务,如果之后没有任务了,则自动停止服务。
因为IntentService单独启动了一个线程,所以即使是耗时任务,也不会阻塞主线程工作,而Service是运行在主线程,可能会出现ANR。 -
JobIntentService:Android O后,用于方便启动JobService的一个工具类。