Service

2020-02-04  本文已影响0人  老北瓜

Service:

1,四大组件之一, 相当于一个没有界面的Activity
2,用于在后台处理耗时操作, 音乐播放,下载
3,不受Activity生命周期影响,有自己的生命周期

服务的两种启动方式: 对应两种生命周期


Service生命周期.jpg

startService 启动方式:
Intent intent = new Intent();
startService(this,MyService.class);
停止服务 :
stopService(intent);

MyService 服务也就有且仅有一个,如果多次调用startService(),操作的都是同一个Service对象,不会再重新创建;如果t退出app,不会销毁Service  

生命周期:
...
bindService 启动方式:
bindService(new Intent(), ServiceConnection(),
BIND_AUTO_CREATE)

停止方式:
    unBindService( ServiceConnection());  ```
ServiceConnection 是连接Service 与 客户端的桥梁;

bindService()并不会让 Service在后台运行起来,只有startService()
如果服务不存在 :onCreate ->onBind ->onUnBind -> onDestroy , 不会在后台运行起来,并会随着Activity的销毁而销毁。之所以会调用onCreate,是因为 bindService()第三个参数BIND_AUTO_CREATE,会自动调用onCreate()
如果服务已经存在 :  那么bindService 只会调用onBind ,unBindService 只会调用onUnbind, 不调用onDestroy().

后台耗时操作应该使用startService().
bindService的作用 是用来实现对Service执行的任务进行进度监控
比如获取下载进度。
而耗时操作就放在onCreate()中执行,仅一次,并且不会受到其他操作的影响。
涉及到 IBinder 和 ServiceConnection
IBinder 是 Android 中用于远程操作对象的一个基本接口
Binder() 实现了 IBinder 接口, 对于onBind()而言,实际上会自己定义内部类集成Binder类,并返回。
class MyBinder extends Binder{
// 定义自己需要的方法 , 具体业务,比如实现进度监控
public int getProcess(){
return i;
}
}
这样一种情形 : startService() - > bindService() -> unbindService(),如果再次调用bindService(),没有执行onBind(), 这里的onBind 只会执行一次,后续的监控都要依靠ServiceConnection 来实现


image.png

IBinder 与ServiceConnection的关系,
在onServiceConnectioned(ComponentName name,iBinder ibinder)
和 onBind()的返回值中都有一个iBinder 对象 , onBind()的返回值可以作为
onServiceConnectioned()的参数
MyBinder myBinder = (MyBinder)iBinder;
myBinder.getProcess(), 就可以拿到Service 中的进度 i ;
并且 bindService() 与 unbinderService() 不会影响到 耗时任务的进度。
执行过程是 先 startService(), 再bindService() .就可以进行进度监控

上一篇下一篇

猜你喜欢

热点阅读