Service 生命周期-

发布时间:   来源:文档文库   
字号:
Service 生命周期
Android Service 生命周期可以促使移动设备的创新,让用户体验到最优越的移动服务,只有broadcast receivers执行此方法的时候才是激活的,当 onReceive(返回的时候,它就是非激活状态。

Serverice的两种启动和结束模式: 1startServericestopServerice 如果没有程序停止它或者它自己停止,service将一直运行。在这种模式下,service开始于调用Context.startService( ,停止于Context.stopService(. service可以通过调用Android Service 生命周期( Service.stopSelfResult(停止自己。不管调用多少次startService( 只需要调用一次 stopService( 就可以停止service

2bindServericeunbindServerice 可以通过接口被外部程序调用。外部程序建立到service的连接,通过连接来操作service。建立连接调开始于Context.bindService(, 结束于Context.unbindService(. 多个客户端可以绑定到同一个service,如果service没有启动, bindService( 可以选择启动它。

2种模式不是完全分离的。你可以可以绑定到一个通过startService(启动的服务。如一个intent想要播放音乐,通过startService( 方法启动后台播放音乐的service。然后,也许用户想要操作播放器或者获取当前正在播放的乐曲的信息,一个activity就会通过bindService(建立一个到此service连接. 这种情况下 stopService( 在全部的连接关闭后才会真正停止service activity一样, service也有可以通过监视状态实现的生命周期。但是比activity要少――只有3个――而且是public的而不是protected 1.
void onCreate( 2. void onStart(Intent intent 3.
void onDestroy( 通过实现这3个方法,可以监视service生命周期的2个嵌套循环:
整个生命周期 onCreate( 开始,从onDestroy( 结束,像activity一样, a Android Service 生命周期在 onCreate(中执行初始化操作,在
onDestroy(中释放所有用到的资源。如:后台播放音乐的service可能在 onCreate(创建一个播放音乐的线程,在onDestroy(中销毁这个线程。 活动生命周期 开始于 onStart(. 这个方法处理传入到startService(方法intent 音乐服务会打开intent查看要播放哪首歌曲,并开始播放。当服务停止的时候,没有方法检测到――没有 onStop( 方法,onCreate( onDestroy( 用于所有通过Context.startService( or Context.bindService( 启动的serviceonStart( 只用于通过startService(开始的service
如果一个Android Service 生命周期是可以从外部绑定的,它就可以触发以下的方法:
1. IBinder onBind(Intent intent 2.
boolean onUnbind(Intent intent
3.
void onRebind(Intent intent onBind( 回调被传递给调用bindService intent onUnbind( unbindService(中的intent处理。如果服务允许被绑定。那么onBind( 法返回客户端和sercie的沟通通道。如果一个新的客户端连接到服务,onUnbind( 会触发onRebind( 调用。
下面的图表说明了sercice的回调方法。下面的图片将通过 startService 通过bindService(启动的service分开了,但是要注意不管他们怎么启动的,都有可能被客户端连接,因此都有可能触发到onBind( onUnbind( 方法。 当经过receiver 请求,broadcast message到达的时候, Android 调用持有messageintent onReceive( 方法,只有broadcast receivers执行此方法的时候才是激活的,当 onReceive(返回的时候,它就是非激活状态 一个含有激活的broadcast receiver的进程是不会被中止的。但是只含有非激活组件的进程在它占用的内存被其他程序请求的时候,任何时间都可以被中止。 当响应broadcast message的程序因为消耗很多时间而在另外一个线程 而非UI所在的线程处理的时候会出现一个问题。
onReceive( 开启一个线程并返回后,整个程序(包括新建的线程)状态是非激活的(除非此进程中有其他激活的组件, 因此这个进程就有被中止的危险。解决这个问题的办法是onReceive( 方法启动一个Android Service 生命周期,sercie去做耗时的工作,这样系统就知道此进程中还有活动的工作。

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 永远不被杀掉,只是提高了他的优先级。


*总结:
1. startService(的目的是回调onStart(方法,onCreate( 方法是在Service不存在的时候调用的,如果Service存在(例如之前调用了bindService,那么ServiceonCreate方法 已经调用了)那么startService(将跳过onCreate( 方法。 2. bindService(目的是回调onBind(方法,它的作用是在Service和调用者之间建立一个桥梁,并不负责更多的工作(例如一个 Service需要连接服务器的操作),一般使用bindService来绑定到一个现有的Service(即通过StartService启动的服 务)。 由于Service onStart(方法只有在startService(启动Service的情况下才调用,故使用onStart(的时候要注意这点。


本文来源:https://www.2haoxitong.net/k/doc/e5148d23a300a6c30c229fb9.html

《Service 生命周期-.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式