Service小结

Service:
当 Android 系统需要对现有的程序数据进行监听,
或者对现有 Actitvity 提供数据服务支撑时,就会使用到
Service一般都是运行于后台,不需要用户界面支撑,
Android支持Service服务的原因目的有两个:
1)简化后台任务的实现
2)实现在同一设备中跨进程的远程信息通信
Service服务主要分为:
Local Service本地服务,只支持同一进程内的应用程序进行访问
Remote Service远程服务,可通过AIDL技术支持跨进程访问

按Service的生命周期模型分为两种类型:
1)startService() stopService():特点 调用简单 方便控制
缺点 一旦启动除了再次调用或结束服 务外就再无法对服务内博状态进行操控 缺乏灵活性
2)bindServiec() unbindService()特点 运用灵活 可以通过IBinder接 口中获取Service的句柄,对Service状态进行检测

Service常用方法:
void onCreate():Service启动时触发,在整个生命周期内只会触发1此
int onStartCommand(Intent intent,int flags,int startId):当通过 startService启动服务时将触发此方法,但当使用bindService 方法 时不会触发此方法,其中参数 intent 是 startCommand 的输入对象 参数 flags 代表 service 的启动方式,参数 startId 当前启动 service 的唯一标式符。返回值决定服务结束后的处理方式
void onRebind(Intent intent):当使用startService启动Service,调用 bindService启动Service,且 onUnbind 返回值为 true 时,下次再 次调用 bindService 将触发方法
boolean onUnbind(Intent intent):调用unbindService 触发此方法,默 认返回 false, 当返回值 true 后,再次调用bindService 时将触发 onRebind 方法
void onDestory():分三种情况:1.以startService启动service,调用 stopService结束时触发此方法;
2.以bindService启动service,
unbindService结束时触发此方法;
3.先以startService 启动服务,
再用bindService绑定服务,
结束时必须先调用unbindService解绑
再使用stopService结束service才会触发此方法
当系统调用Context.startService()方法时,先会触发Service的onCreate()方法,这一般用于对Service的运行条件作初始化处理,且在Service的生命周期内只会被触发一次。然后系统将触发Service的onStartCommand()方法,用户每次调用startService()方法,都会触发onStartCommand()方法。之后,Service 除非在资源不足的情况下被系统 kill 掉,否则Service不会自动结束,直至系统调用Context.stopService()方法时,Service 才会结束。在Service结束时将自动启动onDestory()方法对运转中的Service作最后处理。

注意:即使系统多次调用 startService()或 bindService()方法, onCreate() 方法只会在第一次调用时被触发。同理 onDestory () 方法也只会在服务完结时被触发,其原理可看第2.1节该方法的详细说明。

当系统调用Context.bindService()方法时,也会触发Service的onCreate()方法对Service对象的运行条件作初始化处理,然后触发Service 的 onBind ()方法对服务进行绑定,成功获取Service的句柄后,系统就会通过用户自定义的serviceConnection对象onServiceConnected(ComponentName name, IBinder service)方法,对 Service 对象作出处理。最后当系统调用Context.unbindService()结束服务时,就会激发Service的onDestory()方法对运转中的 Service 作最后的处理。

注意:系统调用 Context.bindService()方法,完成 Service.onBind() 绑定后就会触发 serviceConnection对象的 onServiceConnected()方法,但只要系统未使用 Context.unbindService()方法对 service 服务进行解绑,即使多次调用 bindService(),系统也只会在第一次绑定时调用 onBind() 和 onServiceConnected方()法一次。这正是 startService()与 bindService()方法其中的区别。
单从字面上理解 startService () 启动服务是可以多次执行,所以多次调用 startService()方法都会触发 onStartCommand()事件,而 bindService() 是绑定服务,所以只要服务已经被绑定,在未解绑时也不会多次执行onServiceConnected()绑定后的操作,这也是两者在使用场景上的区别所在。

注意:调用 Context .bindService() 启动 Service 后 ,只能调用 unbindService() 一次,如重复多次调用此方法系统将会抛出错误异常。所以最简单的处理方式是设置一个静态变量 boolean connected,在调用 unbindService() 前先作出判断

无论是使用startService()或者bindService()启动服务,Service服务的运行都是阶段性,当使用stopService()、unbindService()后,Service服务就会结束。然而从现实应用层面上看,Service 服务很多时候是长驻后台的,它会记录程序运行的流程,当今的状态等重要信息。此时,更多的使用方式就是结合startService()、bindService()两种方式调用Service服务,startService()负责管理Service服务的启动,输入初始化参数,bindService()负责定时对Service服务进行检测。而且流程是有规律性,以startService()启动服务后,每使用bindService()绑定服务,就通过serviceConnection对服务进行检测,然后以unbindService()结束绑定。注意,此时服务并未结束,而是长期运行于后台,直到系统以stopService()方法结束服务后,Service才会最终完结。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值