android service详解

一、Service的两种启动方式

startService和BindService,两者的启动Service的生命周期如下所示:

 两种方式区别有前者Service生命周期不跟谁Activity,后者生命周期跟随Activity,一旦Activity被销毁,绑定的Service也就被销毁了。第二,两者的回调函数也有区别,如上图,停止服务前者的回调是直接onDestroy(),后者的回调是onUnbind()->onDestroy()

Service不同于线程的地方在于,通过Service可以与Activity进行通信,onBind返回对应的Binder对象,Binder对象可以获取到Service实例,Activity获取到Service实例之后就可以访问Service内部方法进行通信。

二、这是 Service 的子类,它使用工作线程逐一处理所有启动请求。如果您不要求服务同时处理多个请求,这是最好的选择。 您只需实现 onHandleIntent() 方法即可,该方法会接收每个启动请求的 Intent,使您能够执行后台工作。 
特点: 
1、IntentService会创建单独的Worker线程处理所有的Intent请求; 
2、IntentService会创建单独的worker线程来处理onHandleIntent()方法实现的代码,因此无需处理多线程问题; 
3、所有请求处理完成后,IntentService自动停止。无需调用stopSelf()方法停止该Service; 
4、service的onBind()方法提供了默认实现,返回null; 
5、service的onStartCommand()方法提供了默认实现,该实现会将请求Intent添加到队列中。 
使用方法:扩展IntentService重写onHandlerIntent()方法。

三、为什么要使用Service

其实这跟 android 的系统机制有关,我们先拿Thread 来说。Thread 的运行是独立于 Activity 的,也就是说当一个 Activity 被 finish 之后,如果你没有主动停止 Thread 或者 Thread 里的 run 方法没有执行完毕的话,Thread 也会一直执行。因此这里会出现一个问题:当 Activity 被 finish 之后,你不再持有该 Thread 的引用。另一方面,你没有办法在不同的 Activity 中对同一 Thread 进行控制。

举个例子:如果你的 Thread 需要不停地隔一段时间就要连接服务器做某种同步的话,该 Thread 需要在 Activity 没有start的时候也在运行。这个时候当你 start 一个 Activity 就没有办法在该 Activity 里面控制之前创建的 Thread。因此你便需要创建并启动一个 Service ,在 Service 里面创建、运行并控制该 Thread,这样便解决了该问题(因为任何 Activity 都可以控制同一 Service,而系统也只会创建一个对应 Service 的实例)。

参考文章:https://www.cnblogs.com/perfy/p/3820502.html

猜你喜欢

转载自blog.csdn.net/liangtianmeng/article/details/81290128
今日推荐