Service

·Service简介

Service是Android中实现程序后台运行的解决方案,它非常适用于去执行那些不需要用户交互而且还要求长期运行的任务。Service默认并不会运行在子线程中,也不运行在一个独立的进程中,它同样执行在UI线程中,因此,不要在Service中执行耗时操作,除非在Service中创建了子线程来完成耗时操作。

·Service种类

按运行地点分类:

本地服务(Local Service):该服务依附在主进程上,这样在一定程度上节约了资源。主进程被杀死后,服务便会终止。如:音乐播放器播放等不需要常驻的服务。

远程服务(Remote Service):该服务是独立的进程,在Activity所在进程被杀死时,该服务仍然在运行,不受影响。对应进程名为所在报名加上指定的android:process字符串。如一些提供系统服务的Service。

按运行类型分类:

前台服务,会在通知栏显示onGonting的Notififation,当服务被终止时,通知栏的Notification也会消失。如音乐播放服务。

后台服务,默认的服务即为后台服务,不会在通知栏显示。如天气更新,日期同步等。

按使用方式分类

startService启动的服务:主要用于启动一个服务执行后台任务,不进行通信。停止服务使用stopService。

bindService启动的服务:该服务要进行通信,停止服务用unbindService。

同时使用startService和bindService启动的服务:停止服务同时使用stopService与unbindService。

·Service生命周期

 

onCreate():系统在service第一次创建时执行此方法,来执行只运行一次的初始化工作。如果service已经运行,这个方法不会被调用。

onStartCommand():每次客户端调用startService()方法启动该Service都会回调该方法(多次调用)。一旦这个方法执行,service就启动并且在后台长期运行。通过调用stopService()来停止服务。

onBind():当组件调用bindService()想要绑定到Service时(比如想要执行进程间通讯)系统调用此方法(一次调用,一旦绑定后,下次再调用bindService()不会回调该方法)。在你的实现中,你必须提供一个返回一个IBinder来以使客户能够使用他与service通信,必须总是实现这个方法,但是如果你不允许绑定,那么你应该返回null。

onUnBind():当前组件调用unbindService(),想要接触与service的绑定时系统调用此方法(一次调用,一旦解除绑定后,下次再调用unbindService()会抛出异常)。

onDestory():系统再service不再被使用并要销毁时调用此方法(依次调用)。service应在此方法中释放资源,比如线程等,这时service收到的最后一个调用。

·三种不同情况下Service的生命周期情况

1 startService/stopService

生命周期顺序:onCreateàonStartCommandàonDestroy

第一次startService会触发onCreate和onStartCommand,以后在服务运行过程中,每次startService都只会触发onStartCommand

无论startService多少次,stopService一次就会停止服务。

2 bindService/unbindService

生命周期顺序:onCreateàonBindàonUnBindàonDestroy

第一次bindService会触发onCreate和onBind,以后在服务运行过程中,每次bindService都不会触发任何回调。

3 混合型

当一个Service在被启动(startService)的同时又被绑定(bindService),该Service将会一直在后台运行,并且不管调用了几次,onCreate方法始终只会调用一次,onStartCommand的调用次数与startService调用的次数一致。同时,调用unBindService将不会停止Service,必须调用stopService来停止服务。

·什么情况下使用startService或bindService或同时使用startService和bindService?

1 如果只是启动一个后台长期进行某项任务那么使用startService便可以了。

2 如果想要与正在运行的Service取得联系,那么有两种方法,一种是使用broadcast,另外是使用bindService,前者的缺点是如果交流较为频繁,容易造成性能上的问题,而后者则没有这些问题,因此肯定选择使用bindService。

3 如果你的服务只是公开一个远程接口,供连接上的客户端(android的Service是C/S结构)远程调用执行方法。这个时候可以不让服务一开始就运行,而只用bindService,这样在第一次bindService的时候才会创建服务的实例运行它,这样可以节约很多系统资源。

·Service的几种典型使用实例

1 不可交互的后台服务

不可交互的后台服务即普通的Service,通过startService()方式开启。

2 可交互的后台服务

可交互的后台服务是指前台页面可以调用后台服务的方法,通过bindService()方式开启。

3 混合型后台服务

两种启动方式结合就是混合型交互的后台服务,即可单独进行后台服务,也可运行后台服务中提供的方法,其生命周期:onCreate-->onStartCommand-->onBind-->onUnBind-->onDestroy。

4 前台服务

所谓前台服务只不过是通过一定的方式将服务所在的进程级别提升了。前台服务会一直有一个正在运行的图标在系统的状态栏显示,非常类似于通知的效果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值