Service小结

Service生命周期:

单纯startService:onCreate  onstart ondestroy。每次调用startService就调用一次onstart。调用stopService或stopSelf会回调ondestroy,service将被撤销。

单纯调用bindService:onCreate   onBind  onUnbind   onDestroy。所有绑定者都调用unbindService后就会调用unbind,接着是onDestroy。在所有调用者(组件,如activity)退出后,会自动调用unbind和onDestroy。

先调用startService再调用bindService,回调情况是,调用onCreate onstart onbind。在所有绑定者退出时或解绑后,并不会撤销service,需要调用stopService或者stopSelf。只是调用stopService也无法撤销service,需解绑所有绑定者。

先bindService再startService,回调顺序是onCreate  onBind   onStart,所有绑定者解绑后,service被撤销。调用onUnbind和onDestroy。要撤销,除了解绑所有绑定外,还要调用stopService,顺序可以调乱。所以当所有绑定的组件退出后,service仍然在跑。

bindService需传入三个参数分别是intent,ServiceConnection,int flag。ServiceConnection中有两个方法分别会在bind和unbind的时候调用


Service和BroadcastReceiver的生命周期的区别:

service和broadcastReceiver都是运行在主线程的,所以在onstart或者onReceive方法中执行耗时任务时,要开一个子线程,但receiver开子线程,在子线程执行过程中,onReceive很可能已经执行完,此时进程中可能没有活跃组件了(broadcastReceiver只有在执行onReceiver方法时才被系统认为是活跃的),此时为了让子线程执行完,就要不让进程被kill,就要一个活跃组件,就要启动一个service,因为service在没有调用stop前都是活跃的。


Service的后台概率:

service和thread的区别
thread是cpu调度的基本单位。用于异步执行。由应用进程托管
service是运行在主线程如果是本地服务。如是remote service则在单独进程运行。一个服务只有一个实例,由系统进程托管。
service其实跟很多类是没有什么区别的,也就是定义了一些接口方法。跟一般类的区别是,一个service类只有一个实例。系统帮你管理这个特殊实例。当调用了某些方法后(如,unbind,stopitself,stop),这个实例就不可以问了。这个实例会因为什么不可以操作了,这个就不清楚(或者做个标志和初始化这个对象吧)。
这个实例是全局的,可由各个activity操作。绑定回调bind方法,解绑回调unbind方法。调用实例的startService方法,回调onStart方法。
所有activity解绑后,可能会不允许访问这个实例了。
所以跟子线程半毛关系都没有。就是一个特殊一点的类,跟系统机制有关。后台只是一个概念。
叫做后台有一个重要的原因,就是它的活跃不依赖方法执行或者让用户看到,在用户看不见的地方什么事也不干,系统也算它是活跃的,当一个应用没有在前台运行,avtivity组件不活跃,则receiver执行完onReceive,就不活跃了。进程可能会被杀掉,所以该进程要有服务才能保证该进程不被杀掉。服务service只要开始了就是活跃的。如果有子线程在执行,到不是四大组件之一,还是会被杀掉的。有线程在执行,不能算是进程活跃。

AIDL和Service:

aidl,用于远程service,允许其他应用程序调用和绑定这个服务。本地sevice,只允许本应用调用和绑定。需加一个aidl文件,用idl语言写的。在manifest文件中,注册service时,需加入一个属性proccess:remote。启动远程服务的id必须是gen下的根据aidl文件自动生成的java文件。在服务端(即有aidl文件的那个应用)不用声明remote,在客户端要在manifest的service标签中声明remote。
如果要从服务端返回一个对象,必须要在客户端那里有这个类就要用aidl实现。这个对象要在客户端建立一个.aidl文件,把服务端那边的拷贝过来(包括aidl和对象的java文件)。
主要是那个binder,可以传送对象。




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值