基本概念
当程序进行比较耗时的操作时,用户希望 他们能在后台运行,又不影响用户的其他操作,这就有了service.
service 作为 长期运行在后台的组件,通常用户不进行手动关闭,它就会一直在后台运行。
例如 播放音乐,访问网络 ,下载文件 。。。
分类
service 分为两种
一种是 startService
主要生命周期方法有 Service:onCreate() –>onStartCommand() –>onDestroy()
特点: 1 调用者通过startService 方法启动,通过stopService 方法来停止服务
2 服务启动之后 ,服务与调用者没有任何关系
3 重复调用时 仅会创建一次service 不会重新实例化 ,但会多次调用onStartCommand 方法
4 通常只启动,不返回值
另一种是 bindService
生命周期方法bindService(intent,conn,flag)->Service:onCreate()->Service:onBind()->Service:onUnBind() –>Service:onDestroy()
特点 : 1 通过bindService 方法启动
2 一个服务可以有多个绑定者,只有其中一个调用者进行bind ,服务就会启动 ,当所有的调动者都退出了服务, 服务才会停止.
3 重复调用时 仅会创建一次service 也是不会重新实例化 , 只会调用一次onBind 方法
4 有返回值后 可以进行通讯
startService 使用细节
1 startService 和 stopService 传递的 intent 可以不用全局变量标记,只要 service 的类名相同,启动和停止的service 就是同一个
2 service 的onStartCommnd方法 默认是执行在主线程的 如果有耗时操作,一定要在子线程中执行,防止出现 应用程序无反应 现象, 当然 在销毁时 也要停止线程。
bindService使用细节
1 绑定服务 和解绑服务的ServiceConnection 必须是同一个 ,用全局变量标记。
2 通讯注意
其他
1 一个绑定只能解绑一次 ,多次解绑会有问题
解决方案:为unbindService 方法加上 try–catch 代码块
2 既需要长期后台运行 又需要与服务进行通讯 可以采用 混合调用 方式
混合调用步骤
a 开启服务 startService
b 绑定服务 bindService
c 解绑服务 unbindService
d 停止服务 stopService
3 解绑服务通常是在每个调用服务的activity 的onDestroy 方法中去解绑服务