Android中Service(服务)详解,四大组件之一:Service

转载 2015年12月25日 15:05:28
一、 Service简介
先来看一下官方对Service的定义:
A Service is an application component that can perform long-running operations in the background and does not provide a user interface. Another application component can start a service and it will continue to run in the background even if the user switches to another application. Additionally, a component can bind to a service to interact with it and even perform interprocess communication (IPC). For example, a service might handle network transactions, play music, perform file I/O, or interact with a content provider, all from the background.

翻译过来就是:Service(服务)是一个没有用户界面的在后台运行执行耗时操作的应用组件。其他应用组件能够启动Service,并且当用户切换到另外的应用场景,Service将持续在后台运行。另外,一个组件能够绑定到一个service与之交互(IPC机制),例如,一个service可能会处理网络操作,播放音乐,操作文件I/O或者与内容提供者(content provider)交互,所有这些活动都是在后台进行。

Service的启动有两种方式:context.startService() 和 context.bindService()


二、 Service启动流程
context.startService() 启动流程:
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

context.bindService()启动流程:
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在一个生命周期中只能被调用一次。

三、 Service生命周期 
Service的生命周期并不像Activity那么复杂,它只继承了onCreate()、onStart()、onDestroy()三个方法
当我们第一次启动Service时,先后调用了onCreate()、onStart()这两个方法;当停止Service时,则执行onDestroy()方法。
这里需要注意的是,如果Service已经启动了,当我们再次启动Service时,不会在执行onCreate()方法,而是直接执行onStart()方法。
它可以通过Service.stopSelf()方法或者Service.stopSelfResult()方法来停止自己,只要调用一次stopService()方法便可以停止服务,无论调用了多少次的启动服务方法。

此外,如果别的进程依赖某一个进程的话,那么被依赖的进程会提高优先级。一个进程服务于另一个进程,那么提供服务的进程不会低于获得服务的进程。例如,如果进程A的一个内容提供商服务于进程B的一个客户端,或者进程A的一个service被进程B的一个组件绑定,那么进程A至少拥有和进程B一样的优先级,或者更高。

因为一个运行服务的进程的优先级高于运行后台activity的进程,一个activity会准备一个长时间运行的操作来启动一个服务,而不是启动一个线程–尤其是这个操作可能会拖垮这个activity。例如后台播放音乐的同时,通过照相机向服务器发送一张照片,启动一个服务会保证这个操作至少运行在service 进程的优先级下,无论这个activity发生了什么,广播接收者应该作为一个空服务而不是简单的把耗时的操作单独放在一个线程里。 

关于停止Service,如果service是非绑定的,最终当任务完成时,为了节省系统资源,一定要停止service,可以通过stopSelf()来停止,也可以在其他组件中通过stopService()来停止,绑定的service可以通过onUnBind()来停止service。


相关文章推荐

Android中Service组件详解

Service是Android的四大组件之一,以下是我结合Android Doc和网上资料的学习总结,有不准确的地方请高手指出,互相学习嘛。。。   1.Service是什么 Service是A...

Android四大组件之Service服务

一、Service简介 Service是android 系统中的四大组件之一(Activity、Service、BroadcastReceiver、ContentProvider),它跟Acti...

Android四大组件之Service(一)本地服务

服务service是Android,四大组件之一,Android中的服务和windows中的服务是类似的东西,服务一般没有用户操作界面,它运行于系统中不容易被用户发觉,可以使用它开发如监控之类的程序。...

Android四大组件之------Service(本地服务小案例)

很多童鞋被Service的本地服务与远程服务所困扰,下面就写一个小Demo来展示本地服务跟远程服务的区别:一、概念:本地服务是Service对象与Service的启动者在同个进程中运行, 两者的通信是...

Android四大组件------Service(远程服务AIDL的使用)

一、概念 AIDL (Android Interface Definition Language) AIDL:当两个进程之间想要实现通信时,借助AIDL可以生成可序列化的参数,将对象分解成操作系...

Java乔晓松-android的四大组件之一Service(服务的绑定)

android的四大组件之一Service(服务的绑定)   怎么绑定服务,又怎么解除服务,代码如下: MainActivity.java源码: package com.example.lesson...

android四大组件之Service服务之总体概述

我倾佩每一个比我牛逼的coder! 弄完java语言之后,终于可以搞起Android,鉴于时初学者,现阶段的内容较为基础简单,整理盗用了不少网上的博客和代码,原著勿喷,只为快速学习。 看完四大组件,今...

深入剖析Android四大组件(二)——Service服务之启动与绑定

被绑定的服务是Service类的一个实现,该类允许其他应用程序绑定到服务上并与之交互,为给服务提供绑定,我们必须实现onBind()回调方法。该方法返回一个IBinder对象,该对象定义了客户端可以用...

Android四大组件之Service(服务)

Service是否在Main thread中执行,Service里面是否能执行耗时操作? 默认情况,如果没有显示的指Service所运行的进程,Service和Activity是在运行在当前...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)