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

                                                       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,生命周期)