android Service 服务的生命周期

一、Service的概念 
二、Service的生命周期 

三、实例:控制音乐播放的Service服务器

1、Service的概念网络

Service是Android程序中四大基础组件之一,它和Activity同样都是Context的子类,只不过它没有UI界面,是在后台运行的组件。spa

1.jpg

2、Service的生命周期对象

Service对象不能本身启动,须要经过某个Activity、Service或者其余Context对象来启动。启动的方法有两种,Context.startService和Context.bindService()。两种方式的生命周期是不一样的,具体以下所示。blog

Context.startService方式的生命周期: 
启动时,startService –> onCreate() –> onStart() 
中止时,stopService –> onDestroy()接口

Context.bindService方式的生命周期: 
绑定时,bindService  -> onCreate() –> onBind() 
解绑定时,unbindService –>onUnbind() –> onDestory()生命周期

3、实例:控制音乐播放的Service内存



有了 Service 类咱们如何启动他呢,有两种方法:资源

      • Context.startService() 
      • Context.bindService()
it


     1.  在同一个应用任何地方调用 startService() 方法就能启动 Service 了,而后系统会回调 Service 类的 onCreate() 以及 onStart() 方法。这样启动的 Service 会一直运行在后台,直到 Context.stopService() 或者 selfStop() 方法被调用。另外若是一个 Service 已经被启动,其余代码再试图调用 startService() 方法,是不会执行 onCreate() 的,但会从新执行一次 onStart() 。

      2. 另一种 bindService() 方法的意思是,把这个 Service 和调用 Service 的客户类绑起来,若是调用这个客户类被销毁,Service 也会被销毁。用这个方法的一个好处是,bindService() 方法执行后 Service 会回调上边提到的 onBind() 方发,你能够从这里返回一个实现了 IBind 接口的类,在客户端操做这个类就能和这个服务通讯了,好比获得 Service 运行的状态或其余操做。若是 Service 尚未运行,使用这个方法启动 Service 就会 onCreate() 方法而不会调用 onStart()。

     

      总结:

      1. startService()的目的是回调onStart()方法,onCreate() 方法是在Service不存在的时候调用的,若是Service存在(例如以前调用了bindService,那么Service的onCreate方法已经调用了)那么startService()将跳过onCreate() 方法。

      2.  bindService()目的是回调onBind()方法,它的做用是在Service和调用者之间创建一个桥梁,并不负责更多的工做(例如一个Service须要链接服务器的操做),通常使用bindService来绑定到一个现有的Service(即经过StartService启动的服务)。

      因为Service 的onStart()方法只有在startService()启动Service的状况下才调用,故使用onStart()的时候要注意这点。

 

与 Service 通讯而且让它持续运行

      若是咱们想保持和 Service 的通讯,又不想让 Service 随着 Activity 退出而退出呢?你能够先 startService() 而后再 bindService() 。当你不须要绑定的时候就执行 unbindService() 方法,执行这个方法只会触发 Service 的 onUnbind() 而不会把这个 Service 销毁。这样就能够既保持和 Service 的通讯,也不会随着 Activity 销毁而销毁了。

 

提升 Service 优先级

      Android 系统对于内存管理有本身的一套方法,为了保障系统有序稳定的运信,系统内部会自动分配,控制程序的内存使用。当系统以为当前的资源很是有限的时候,为了保 证一些优先级高的程序能运行,就会杀掉一些他认为不重要的程序或者服务来释放内存。这样就能保证真正对用户有用的程序仍然再运行。若是你的 Service 碰上了这种状况,多半会先被杀掉。但若是你增长 Service 的优先级就能让他多留一会,咱们能够用 setForeground(true) 来设置 Service 的优先级。

      为何是 foreground ? 默认启动的 Service 是被标记为 background,当前运行的 Activity 通常被标记为 foreground,也就是说你给 Service 设置了 foreground 那么他就和正在运行的 Activity 相似优先级获得了必定的提升。当让这并不能保证你得 Service 永远不被杀掉,只是提升了他的优先级。

 

摘自网络其余资料:关于Service生命周

Android Service生命周期与Activity生命周期是类似的,可是也存在一些细节上也存在着重要的不一样:

onCreate和onStart是不一样的

经过从客户端调用Context.startService(Intent)方法咱们能够启动一个服务。若是这个服务尚未运行,Android将启动它而且在onCreate方法以后调用它的onStart方法。若是这个服务已经在运行,那么它的onStart方法将被新的Intent再次调用。因此对于单个运行的Service它的onStart方法被反复调用是彻底可能的而且是很正常的。

onResume、onPause以及onStop是不须要的

回调一个服务一般是没有用户界面的,因此咱们也就不须要onPause、onResume或者onStop方法了。不管什么时候一个运行中的Service它老是在后台运行。

onBind

若是一个客户端须要持久的链接到一个服务,那么他能够调用Context.bindService方法。若是这个服务没有运行方法将经过调用onCreate方法去建立这个服务但并不调用onStart方法来启动它。相反,onBind方法将被客户端的Intent调用,而且它返回一个IBind对象以便客户端稍后能够调用这个服务。同一服务被客户端同时启动和绑定是很正常的。

onDestroy

与Activity同样,当一个服务被结束是onDestroy方法将会被调用。当没有客户端启动或绑定到一个服务时Android将终结这个服务。与不少Activity时的状况同样,当内存很低的时候Android也可能会终结一个服务。若是这种状况发生,Android也可能在内存够用的时候尝试启动被终止的服务,因此你的服务必须为重启持久保存信息,而且最好在onStart方法内来作

相关文章
相关标签/搜索