Service相关

2021-12-26  本文已影响0人  Infinity_空
  1. 启动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与服务绑定,进行一些交互
  2. 如果一个service既被startService又被bindService会有什么情况?
    不管是startService还是bindService,onCreate只会调用一次,即service只会被创建一次。每调用一次startService,onStartCommand就会被调用一次。此后,如果要关闭service,需要同时调用stopService和unbindService(或者是客户端关闭),否则这个service不会被停止。

  3. Service如何保活

    1. 启动多个service互相拉起
    2. 监听系统广播或者是三方应用广播(微信、支付宝等)进行唤醒
    3. 利用账号同步机制拉活
    4. 提高service的优先级,延长被kill的时间
    5. 利用像素为1的Activity,监听解锁屏和截屏的广播
    6. JobScheduler唤醒Service,Android7.0失效(因为如果没有启动前台服务,则会抛出IllegalStateException)
  4. IntentService:IntentService继承于Service,默认开启一个工作线程,不断接收Intent执行任务,每次只执行一个任务,执行完毕之后,再执行下一个任务,如果之后没有任务了,则自动停止服务。
    因为IntentService单独启动了一个线程,所以即使是耗时任务,也不会阻塞主线程工作,而Service是运行在主线程,可能会出现ANR。

  5. JobIntentService:Android O后,用于方便启动JobService的一个工具类。

上一篇下一篇

猜你喜欢

热点阅读