概念
service 有2种启动方法,startService与bindService
startService
1)onCreate()- >onStartCommand()->startService()->onDestroy()
2)调用者和服务之间没有联系,即使调用者退出了,服务依然在进行
3)通常,started的服务执行单一的操作并且不会向调用者返回结果
bindService
1)onCreate()->onBind()->onUnbind()->onDestroy()
2)调用者和绑定者绑在一起,调用者一旦退出服务也就终止了
3)bound服务提供了一个客户端/服务器接口,允许组件与服务进行交互、发送请求、获取结果,甚至可以利用进程间通信(IPC) 跨进程执行这些操作。
1)onCreate()- >onStartCommand()->startService()->onDestroy()
2)调用者和服务之间没有联系,即使调用者退出了,服务依然在进行
3)通常,started的服务执行单一的操作并且不会向调用者返回结果
bindService
1)onCreate()->onBind()->onUnbind()->onDestroy()
2)调用者和绑定者绑在一起,调用者一旦退出服务也就终止了
3)bound服务提供了一个客户端/服务器接口,允许组件与服务进行交互、发送请求、获取结果,甚至可以利用进程间通信(IPC) 跨进程执行这些操作。
下面大概说下startService与bindService的简单使用
生命周期
Context.startService()
1)startService:调用Service的onStartCommand方法
Intent intent = new Intent(this,HelloService.class);
startService(intent);
2)stopService:
//方法1:
Intent intent = new Intent(MainActiviry.this,HelloService.class);
stopService(intent);
//方法2:在Service中调用
stopSelf();
然而,如果Service同时处理多个请求,那么你不应该停止服务,当你完成处理开始请求。因为你可能已经收到了一个新的开始的请求(在第一次请求结束时停止将终止第二个)。为了避免这个问题,你可以用stopSelf(int)来保证你的要求停止服务都是基于最新的启动请求。
Context.BindService()
1)bindService:调用Service中onbind方法
bindService(Intent intent , ServiceConnection conn , int flags)
2)unbindService:调用onUnbind方法
2)unbindService:调用onUnbind方法
unbindService(ServiceConnection conn);
注意:
一旦服务与所有的clients断开连接,系统就会销毁它。
Started 和 Bound的交集使用
1)Started
和
Bound 是可以交集的使用
2)
同时处于started与bound中的Service,被调用stopService或unbindService
说明:
a)
现在已经存在MyService,被startService启动
调用stopService时,就会执行OnDestroy()方法,停止掉service的执行,但是service本身是非队列的,所以可能同时在处理多个请求,但Service是单例的,所以请求前要注意其他请求是否已经完成。否则同时被destroy掉。
b)现在已经存在MyService,被bindService启动
调用unbindService时,MyService不在与调用unbindService的组件绑定,但其他组件不受影响。当unbindService时,刚好是最后一个bind的组件,则同时会destroyMyService,执行onDestroy()方法
c)现在已经存在MyService,同时被startService和bindService启动。
如果这时候,执行stopService,必定会触发的是MyService已不是started service,就不在拥有started service的特性,但是否会Destroy,取决于MyService当前是否被bind,如果没有bind,则会执行onDestroy()方法。否则不会。
如果这时候,执行unbindService,必定会触发的是MyService不在与调用unbindService方法的组件绑定,但是否会Destroy,取决于2点,一是是否有和其他组件绑定,而是当前的Service是否被startServce启动了。如果都不满足,则会执行onDestroy()方法。