IntentService介绍
要想了解IntentService首先要知道它的父类Service的功能
1.Service
Service是android 系统中的一种组件,它跟Activity的级别差不多,但是他不能自己运行,只能后台运行,并且可以和其他组件进行交互。Service的启动有两种方式:context.startService() 和 context.bindService()。这里的context可以简单地先理解为我们常用的Activity。
使用context.startService() 启动Service是会会经历:context.startService() ->onCreate()->onStart()->Service running->context.stopService() | ->onDestroy() ->Service stop
如果Service还没有运行过,则android软件先调用onCreate()然后调用onStart();如果Service已经运行,则只会调用onStart(),所以一个Service的onStart方法可能会重复调用多次。
stopService的时候直接onDestroy,如果是调用者自己直接退出而没有调用stopService的话,Service会一直在后台运行。该Service的调用者再启动起来后可以通过stopService关闭Service。
所以调用startService的生命周期为:onCreate –> onStart(可多次调用) –> onDestroy。
而我们通过startService()的方式调用Service时,可以通过重写其中的onCreate,onStart和onDestory三个方法来实现我们的具体需求,其中我个人认为最重要的是重写onStart方法,主要是因为onStart方法可多次调用。
使用context.bindService()启动Service会经历:
context.bindService()->onCreate()->onBind()->Service running->onUnbind() -> onDestroy() ->Service stop
onBind将返回给客户端一个IBind接口实例,IBind允许客户端回调服务的方法,比如得到Service运行的状态或其他操作。这个时候把调用者(Context,例如Activity)会和Service绑定在一起,Context退出了,Srevice就会调用onUnbind->onDestroy相应退出。
所以调用bindService的生命周期为:onCreate –> onBind(只一次,不可多次绑定) –> onUnbind –> onDestory。
在Service每一次的开启关闭过程中,只有onStart可被多次调用(通过多次startService调用),其他onCreate,onBind,onUnbind,onDestory在一个生命周期中只能被调用一次。
其中是选择通过startService还是bindService的方式取决于context是否需要得到Service的运行信息或者说返回值,如果需要得到的话,则一定要采取bindService的方式。
2.IntentService
IntentService与它的父类Service的最大区别可以理解为IntentService是实现了多线程的Service。我们调用Service时,Service只是在后台运行,我们看不到而已,但实际上需要等Service在后台运行完毕我们才能进行下一步操作,而如果后台运行的Service是非常耗时的,则前台的程序就会出现假死状态,这是我们不希望看到的。
IntentService就是为解决这个耗时而产生的,在调用IntentService时,IntentService所进行的操作会像Java中的线程一样,动态获得系统的内存,同时前台可继续进行其他操作,这就很好的解决了Service中耗时的问题。IntentService中最重要的部分就是重写其中的onHandleIntent(Intent)方法,接收一个Intent对象,进行一系列的操作。当IntentService接收到多个任务后,会按顺序逐个执行,执行完后对应的IntentService会自动停止。
3.Service与IntentService的使用效果对比
我写了一个小程序来简单地对比Service和IntentService的实际效果。
在主程序中启动Service和IntentService没有任何区别,但是通过startService方式启动的Service需要调用stopService才能停止。而通过startService方式启动的IntentService会在工作完成后自动停止。
IntentService与Service在编写是最大的不同有亮点,一是最好能写一个默认的构造方法,否则会报无法实例化服务的错误,这个错误的排查花了我很多功夫。二是需要重写IntentService中的onHandleIntent方法,里面是我们要调用线程在后台执行的关键部分。
这是效果的对比图,点击调用Service,如果Service运行的是一个耗时操作,前台界面会呈现假死状态,无法进行进一步操作,很多时候这种情况是我们不愿看到的。而点击调用IntentService后,ItentService会在后台自动运行(即使有多个),而用户可点击前台界面做进一步操作。
4.总结
虽然Service和IntentService都市所谓的后台服务,我个人意见,如果是非耗时的操作,推荐用Service,Service用起来简单。而如果是耗时的操作,则强烈建议使用IntentService。





















