android service详解

本文深入探讨Android中的Service组件,对比startService与BindService的区别,包括生命周期、回调函数及通信方式。解析IntentService特性,如独立Worker线程处理、自动停止机制及默认onBind与onStartCommand实现。阐述为何在多Activity环境中使用Service而非Thread,解决跨Activity通信与资源管理难题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值