startService与bindService









概念

service 有2种启动方法,startService与bindService



startService
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调用Serviceonbind方法
bindService(Intent intent , ServiceConnection conn , int flags)

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()方法。









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值