您的位置:首页 > 移动开发 > Android开发

Android之四大组件之一-Service(二)

2016-07-01 17:14 459 查看

                                                     
 Service生命周期与停止

1.startService启动Service涉及生命周期方法:

 onCreate()--onStartCommand()/onStart()--onDestory()

 1)onCreate()创建Service实例时的回调函数,

    启动的Service实例如果不存在会触发一次之后不会触发.

 2)onStartCommand()  启动Service时的回调函数每次启动都会触发
    可以通过参数startId获取其启动次数.
    第二个参数flags表示启动服务的方式:  
    当前值为:
0,START_FLAG_REDELIVERY,START_FLAG_RETRY.  

                   START_FLAG_REDELIVERY: 如果你实现onStartCommand()
  来安排异步工作或者在另一个线程中工作, 那么你可能需要使用START_FLAG_REDELIVERY来让系统重新发送一个intent
  。这样如果你的服务在处理它的时候被Kill掉, Intent不会丢失.  

                   START_FLAG_RETRY:表示服务之前被设为START_STICKY,
  则会被传入这个标记。

 3)onStart():启动Service时,已经被淘汰了。

 4)onDestory():销毁Service实例

注意:
onStartCommand()的返回值用来指定Service的系统在用户为手动关闭Service前自动回收Service资源了Service资源情况下的重启行为:
a)START_STICKY

如果service进程被kill掉,保留service的状态为开始状态,

但不保留递送的intent对象。随后系统会尝试重新创建service,

由于服务状态为开始状态,所以创建服务后一定会调用

onStartCommand(Intent,int,int)方法。如果在此期间没

有任何启动命令被传递到service,那么参数Intent将为null。
b)START_NOT_STICKY

“非粘性的”。如果在执行完onStartCommand后,

服务被异常kill掉,系统不会自动重启该服务。
c)START_REDELIVER_INTENT

使用这个返回值时,如果在执行完onStartCommand后,

服务被异常kill掉,系统会自动重启该服务,

并将Intent的值传入。
d)START_STICKY_COMPATIBILITY:

 START_STICKY的兼容版本,但不保证服务被kill后一定能重启。

2.bindService启动Service的生命周期方法:

onCreate()--->onBind()--->onUnbind()--->onDestory().

a)onCreate() 同startService

b)onBind()  在Service与调用者建立关联关系时使用
  该方法会返回一个IBinder类型的实例给调用者,

           作为Service在调用者的代理.

c)onUnbind() Service与调用者解除绑定。

d)onDestory() 同startService

e)onRebind() 重新连接

Service停止:针对不同启动方式,可以使用两种方式在
调用者中手动关闭Service

stopService(Intent it);

unbindService(ServiceConnection conn)

IntentService:

Android中的Service是用于后台服务的,当应用程序被挂到后台的时候,为了保证应用某些组件仍然可以工作而引入了Service这个概念,那么这里面要强调的是Service不是独立的进程,也不是独立的线程,它是依赖于应用程序的主线程的,也就是说,在更多时候

不建议在Service中编写耗时的逻辑和操作,否则会引起ANR(Application Not Responding)。那么我们当我们编写的耗时逻辑,不得不被service来管理的时候,在Service启动一个新子线程,在子线程完成耗时操作。

就需要引入IntentService,

IntentService是继承Service的,那么它包含了Service的全部特性,当然也包含service的生命周期,那么与service不同的是,IntentService在执

行onCreate操作的时候,内部开了一个线程,去你执行你的耗时操作。该线程保证同一时刻只处理一个Intent.这样IntentService不会阻塞主线程。

IntentService的使用和Service是类似。它需要重写

onHandleIntent(Intent intent)方法。

注意:service 没有unbind时was originally bound here错误。

 在程序中,如果在activity中绑定了服务,

 而没有在destory中,写unbind,会出现这种异常,

 解决方式:在Activity的onDestory方法中调用unbindService(sc)

 方法,该方法是context中的方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Service 生命周期