Android四大组件之Service
2017-03-16 本文已影响62人
程序员丶星霖
Android四大组件之Service
Activity的基础终于差不多了,今天就好好看看Service吧!
Service简介
Service是Android四大组件中与Activity最相似的组件,它们都代表可以执行的程序,Service与Activity的区别在于:Service一直在后台运行,没有用户界面,因此绝不会到前台来。一旦Service被启动起来之后,就与Activity一样,具有自己的生命周期。
怎样选择Activity或Service:
- 如果某个程序组件需要在运行时向用户呈现某个界面,或该程序需要与用户交互,就需要使用Activity;
- 否则就应该考虑使用Service。
创建Service
与Activity相似,创建Service也需要两个步骤:
- 定义一个继承Service的子类;
- 在AndroidManifest.xml文件中配置该Service。
与Activity相似,Service中也定义了一系列的生命周期方法,如下所示:
- IBinder onBind(Intent intent):该方法是Service子类必须实现的方法,该方法返回一个IBinder对象,应用程序可通过该对象与Service组件通信。
- onCreate():在Service第一次被创建后将立即回调该方法。
- onDestroy():在Service被关闭之前将会回调该方法。
- onStartCommand(Intent intent, int flags, int startId):该方法的早期版本是onStart(Intent intent, int startId),每次客户端调用startService(Intent)方法启动该Service时都会回调该方法。
- onUnbind(Intent intent):当该Service上绑定的所有客户端都断开连接时将会回调该方法。
在Android系统中运行Service有如下两种方式:
- 通过Context的startService()方法:通过该方法启动Service,访问者与Service之间没有关联,即使访问者退出了,Service也仍然运行。
- 通过Context的bindService()方法:使用该方法启动Service,访问者与Service绑定在一起,访问者一旦退出,Service也就终止了。
Service的生命周期
Service的生命周期比Activity的生命周期要简单的多。但是,更加关注如何创建和销毁服务反而更加重要,因为服务可以在用户没有意识到的情况下运行于后台。
Service的生命周期可以遵循两条不同的路径:
- 启动服务
该服务在其他组件调用startService()时创建,然后无限期运行,且必须通过调用stopSelf()来自行停止运行。此外,其他组件也可以通过调用stopService()来停止服务。服务停止后,系统将会将其销毁。 - 绑定服务
该服务在另一个组件调用bindService()时创建。然后,客户端通过IBinder接口与服务进行通信。客户端可以通过调用unbindService()关闭连接。多个客户端可以绑定到相同服务,而且当所有绑定全部取消后,系统即会销毁该服务。
![](https://img.haomeiwen.com/i4625756/6692085f98b229d5.png)
通过实现这些方法,我们可以监控服务生命周期的两个嵌套循环:
- 服务的整个生命周期从调用onCreate()开始,到onDestroy()返回时结束。与Activity类似,服务也在onCreate()中完成设置,并在onDestroy()中释放所有剩余资源。
- 服务的有效生命周期从调用onStartCommand()或onBind()方法开始。每种方法均有Intent对象,该对象分别传递到startService()或bindService()。
注意: - 尽管启动服务是通过调用stopSelf()或stopService()来停止,但是该服务并无相应的回调(没有onStop()回调)。因此,除非服务绑定到客户端,否则在服务停止时,系统会将其销毁(onDestroy()是接收到的唯一回调)。
IntentService
IntentService是Service的子类,因此它不是普通的Service,它比普通的Service增加了额外的功能。
Service本身存在两个问题:
- Service不会专门启动一个单独的进程,Service与它所在应用位于同一个进程中。
- Service不是一条新的线程,因此不应该在Service中直接处理耗时操作的任务。
然而IntentService正好弥补了Service的上述两个不足,IntentService具有如下特征:
- IntentService汇创建单独的worker线程来处理所有的Intent请求。
- IntentService会创建单独的worker线程来处理onHandleIntent()方法实现的代码,因此开发者无需处理多线程问题。
- 当所有请求处理完成后,IntentService会自动停止,因此开发者无须调用stopSelf()方法来停止该Service。
- 为Service的onBind()方法提供了默认实现,默认实现的onBind()方法返回null。
- 为Service的onStartCommand()方法提供了默认实现,该实现会将请求Intent添加到队列中。
Service的介绍就到这里吧。欢迎大家关注我的公众号!
![](https://img.haomeiwen.com/i4625756/b4d103408ed3700a.jpg)