Android Service和IntentService(启动方式startService和bindService)

Service是什么?

  • Service是Android四大组件之一,Service是长期运行在后台的应用程序组件。
  • Service不是进程,也不是线程,它和应用程序在同一个进程中,它更像是一个没有UI的Activity
  • Service运行在主线程中,不能做耗时操作

IntentService是什么?

  • IntentService继承于Service,启动方式和Service一样
  • 优势:
    • 带有一个工作线程来处理耗时操作,在onHandleIntent中进行耗时操作,可以启动IntentService多次,每一个耗时任务都会以队列的方式在onHandleIntent回调方法中执行,每次执行一个
    • 当任务完成后(onHandleIntent执行完)自动退出,无需手动停止Service
  • 工作流程:
    查看IntentService源码发现,在onStartCommand中调用了onStart()方法,在onStart中向子线程的Handler发送了一个消息,在handleMessage中执行了onHandleIntent的抽象方法,由我们继承的子类完成具体内容,最后调用了stopSelf来关闭当前Service
  • 可以使用Service+协程,实现类似IntentService的操作,来解决Service中需要执行的耗时操作
  • 不推荐单独使用bindService启动IntentService是因为不会执行onHandleIntent方法
  • Android 8.0以上不推荐使用IntentService了,Google推荐使用JobIntentService

Service应用场景

  • 后台播放音乐,定位服务,每隔一定时间和服务器进行交互等

Service两种启动方式,和生命周期

  • startService

    • 启动一个服务,不与组件进行通信,停止服务使用stopService,生命周期独立,一旦启动可以在后台无限期运行下去,即使当启动它的组件已销毁
    • Service在系统中被启动多次,系统只会创建一个该Service实例,onCreate只会执行一次,onStartCommand方法调用次数和启动次数一致
  • bindService

    • 启动并绑定服务,绑定服务后,Activity可以和服务进行交互,Activity销毁后,服务解绑
    • 绑定Service内部会调用onCreate、onBind
    • 不会走onStartCommand方法
      这里写图片描述

startService和bindService结合使用

  • 使用场景
    使用startService启动一个服务后,需要和服务通信,使服务绑定到Activity
  • 若要停止服务(无论是先启动,还是先绑定)
    既需要解绑(或者activity销毁自动解绑),也需要停止

startService和bindService结合使用日志

  • 启动服务,绑定服务,解绑服务,停止服务
    (解绑服务后,没有销毁,需要点击停止服务)
E/MyService: onCreate: 
E/MyService: onStartCommand: 
E/MyService: onServiceConnected: 
//点击解绑后出现
E/MyService: onUnbind: 
//点击停止后出现
E/MyService: onDestroy: 
  • 绑定服务,启动服务,停止服务,解绑服务
    (停止服务后,并没有停止,需要在解绑一下)
E/MyService: onCreate: 
E/MyService: onServiceConnected: 
E/MyService: onStartCommand: 
//点击解绑后出现onUnbind,onDestroy
E/MyService: onUnbind: 
E/MyService: onDestroy: 

其他

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值