您的位置:首页 > 移动开发 > Android开发

Android基础知识总结---四大组件之一Service(一)

2016-07-13 22:48 1171 查看

一:Service的概述

Service是Android四大组件中与Activity最相似的组件。都代表执行程序,Service与Activity的区别在于:

Service一直在后台运行,它没有用户界面,所以绝不会到前台来。一旦Service被启动起来之后,它就与Activity一样。完全具有自己的生命周期。

关于程序中Activity和service的选择标准:

如果某个程序组件需要在运行时向用户呈现某种界面,或者该程序需要与用户交互,就需要使用Activity,否则就应该考虑使用Service了。 如:下载东西,播放音乐。可以一边下载,一边播放,一边玩其他的事情。但是Activity是无法做到的。只要Activity被关闭或者最小化了,程序就停止了。

二:Service的特点

1.没有UI

2.进行耗时较长或者与用户没有交互的一些功能

3.Service具有较高的优先级比stop的Activity优先级要高,最高优先级的是前台的Activity

4.具有较长的生命周期

三:Service的生命周期

同样的Service也有自己的生命周期,而且随着Service的启动方式的不同,他的生命周期也略微不同:

第一种方式:通过调用startService()方法启动

onCreate()–onStartCommand()/onStart()–onDestory()

a)onCreate()创建Service实例时的回调函数,启动的Service实例如果不存在会触发一次之后不会触发.

b)onStartCommand(Intent intent, int flags, int startId) 启动Service时的回调函数每次启动都会触发

//第一个参数是意图//第二个参数是标志位(启动Service时传递过来的)//第三个参数是启动该Service的次数

//返回值指定 Service被异常Kill掉后的重启行为,如果你实现onStartCommand()来安排异步工作或者在另一个线程中工作,

那么你可能需要使用START_REDELIVER_INTENT来让系统重新发送一个intent,这样被kill掉的Service会自动重启

如果return Service.START_NOT_STICKY,此时被kill掉的Service将不会重启

c)onStart():启动Service时,该方法已经被淘汰了。

d)onDestory():人为调用stopService(intent)方法销毁Service实例回调该方法

注意:

onStartCommand()的返回值用来指定Service的系统在用户为手动关闭Service前自动回收Service资源情况下的重启行为:

a)START_STICKY

如果service进程被kill掉,保留service的状态为开始状态,但不保留递送的intent对象。随后系统会尝试重新创建service,由于服务状态为开始状态,所以创建服务后一定会调用onStartCommand(Intent,int,int)方法。如果在此期间没有任何启动命令被传递到service,那么参数Intent将为null。

b)START_NOT_STICKY

“非粘性的”。如果在执行完onStartCommand后,服务被异常kill掉,系统不会自动重启该服务。

c)START_REDELIVER_INTENT

使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统会自动重启该服务,并将Intent的值传入。

d)START_STICKY_COMPATIBILITY:

START_STICKY的兼容版本,但不保证服务被kill后一定能重启。

第二种方式:通过调用bindService()方法启动

onCreate()—>onBind()—>onUnbind()—>onDestory().

a)onCreate() 同startService

b)onBind() 在Service与调用者建立关联关系时使用,该方法会返回一个IBinder类型的实例给调用者,作为Service在调用者的代理.

c)onUnbind() Service与调用者解除绑定时回调

d)onDestory() 同startService

e)onRebind() 与调用者重新建立连接时回调

注:

关于Service的停止:针对不同启动方式,可以使用两种方式在调用者中手动关闭Service,分别是:

1)stopService(Intent it);

2)unbindService(ServiceConnection conn)

四:Service的使用

1)创建:

创建类去继承Service,实现OnBind()方法。Service与Activity都是从Context派生出来的。因此可以使用Context中的方法,比如getResouces()等方法。

2)配置:

在配置文件中配置标签,设置android:name属性,也可以配置元素

3)启动:

Service启动依赖于其他组件,可以使用Activity或者Receiver等作为调用者,调用者可以使用以下两种形式启动Service

(1)startService(Intent service)

该方法用来启动一个独立的Service实例,该实例与调用者没有关联关系,调用者的生命周期不会影响到Service的生命周期

即使访问者退出了,Service仍然运行。

(2)bindService(Intent service, ServiceConnection conn, int flags)

该方法用来将一个Service实例与调用者建立关联关系,Service与调用者之间可以进行数据共享,调用者生命周期会影响的Service的生命周期,即访问者退出了,Service也就终止了,bindService方法有三个参数:

第一个参数包含要绑定Service信息的Intent对象

第二个参数是一个ServiceConnection对象,该对象用于监听访问者与Service之间的连接情况,当访问者与Service之间链接成功时将回调该对象的onServiceConnected(ComponentName name, IBinder service)方法,而当Service所在的宿主进程由于异常中止或由于其他原因终止,导致该Service与访问者之间断开连接时回调该ServiceConnection对象的onServiceDisconnected(ComponentName name)方法。其中调用者中的onServiceConnected方法中的IBinder对象,通过他可实现与被绑定的Service之间的通信。在开发Service类时,该Service类必须提供一个IBinder onBind()方法,该方法所返回的IBinder对象将会传给ServiceConnection对象里onServiceConnected方法的参数中。这样访问者就可以通过该IBinder对象与Service进行通信。实际开发时通常会采用继承Binder(IBinder的实现类)的方式实现自己的IBinder对象,再将其返回给启动者

第三个参数指定绑定时是否自动创建Service(如果Service还未创建),该参数可指定为0(不自动创建)或

BIND_AUTO_CREATE(自动创建)。

五、关于IntentService

Android中的Service是用于后台服务的,当应用程序被挂到后台的时候,为了保证应用某些组件仍然可以工作而引入了Service这个概念,那么这里面要强调的是Service不是独立的进程,也不是独立的线程,它是依赖于应用程序的主线程的,也就是说,在更多时候不建议在Service中编写耗时的逻辑和操作,否则会引起ANR(Application Not Responding)。那么当我们编写耗时的逻辑,不得不被service来管理的时候,就需要在Service中启动一个新的子线程,在子线程完成耗时操作。就需要引入IntentService,而IntentService是继承Service的,它包含了Service的全部特性,当然也包含service的生命周期,那么与service不同的是,IntentService在执行onCreate操作的时候,内部又开了一个线程去执行你的耗时操作。该线程保证同一时刻只处理一个Intent.这样IntentService不会阻塞主线程。IntentService的使用和Service是类似的。它需要重写onHandleIntent(Intent intent)方法。

注意

在程序中,如果在activity中绑定了服务,而没有在destory中调用unbind()方法时就可能会出现was originally bound here错误。,

解决方式:在Activity的onDestory方法中调用手动unbindService(sc)方法,该方法是context中的方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android