安卓服务——started service一个非绑定式服务

Started Service(非绑定服务)

△本文将会向你讲述以下内容:

→非绑定式服务定义,特点。

→如何启动,停止服务。

→生命周期方法说明。

→怎样创建一个你自己的服务。

→与你所创建的服务通信。

 

△非绑定式服务定义:一个由startService()方法所启动的服务,就是非绑定式服务。(关于服务的定义我不在这里说了,仅仅介绍非绑定式服务基本信息)

 

△特点:非绑定式服务启动以后,有他自己的生命周期,而且他的生命周期不依赖于启动他的那个组件(即该服务是独立运行的)。即使启动他的那个组件被销毁了,这个服务仍然活着,只有两个方式可以将他手动停下:

(1)自我结束:stopSelf();

(2)或者其他组件将它停下:stopService(intent)。(在特定的情况之下会被系统自动结束,这个不在这里讨论。)

 

△如何启动以及停止服务:

→启动服务:

调用方法startService(intent)就能启动一个非绑定式服务,任一组件可以使用该方法去启动一个非绑定式服务(其实大多数情况下他都是被窗体启动),被启动的那个服务在”onStartCommand()”方法里面接收那个Intent。

截图如下:启动一个非绑定式服务



 

注意:默认情况下,启动后的服务是运行在主线程里面的,如果你在服务里面执行耗时操作,他将影响UI线程与用户的交互,解决办法:在服务里另起一个线程执行服务内的操作。

 

→停止服务:两个方法停止一个服务

(1)stopSelf():在服务的内部自己调用停止自己。

(2)stopService(intent):由其他的组件调用停止服务。

 

△生命周期方法说明     

→非绑定式服务生命周期:

startService();→onCreate();→onStartCommand();→onDestroy();

 

解读:

startService():其他组件调用他来启动一个非绑定式服务,这个不是生命周期方法之一。

onCreate():如果调用上一个函数时,该服务是第一次被启动,将会回调这个生命周期方法。如果不是第一次被启动,这个方法不会调用,而是直接跳去下面一个方法。这个就是服务的初始化方法。

onStartCommand():每次调用startService()该方法都会被执行一次(所以如果你想你的服务能被非绑定式方法启动,你必须复写该方法)。如果你只想服务被绑定式方法启动,你不用复写该方法。

onDestroy():当调用了stopSelf()或者stopService(intent);将执行他(前提是服务已开启),他是服务生命周期最后一个被调用的方法,他执行后,服务被销毁。

注意onStartCommand()的返回值,他返回一个整型值,这个整型值将决定当服务被结束之后发生什么。他只能是以下三个之一:

(1)START_NOT_STICKY:当服务被结束之后,系统不会重新启动这个服务,这个服务永远被结束了(除非你重新开启它)

(2)START_STICKY:当服务被结束之后,系统会重新启动他,但是不会传递任何Intent给他,这适合于音乐播放器之类的服务(没有可执行的指令,但是不断等待新的任务)

(3)START_REDELIVER_INTENT:当服务被结束之后:系统会重新启动他,而且会将最后一次传给他的Intent再传一次。

复写该方法那时候系统默认提供一个返回值,你也可以去修改他。

 

 

△怎样创建一个服务:你可以通过继承以下的任一个类,创建你自己服务类:

→Service:这是最基本的服务类,如果你继承这个类,你一定要在服务里新开一个线程处理所有工作(这很重要),因为服务使用的也是主线程。如果你在主线程里执行耗时操作,他将影响UI线程与用户的交互。

→IntentService:这是Service的子类,他的细节下面细说。使用该类,你只要做两件事情:(1)复写onHandleIntent(),这个方法将会接收Intent。(2)增加一个空参数的构造函数。注意:使用他你连生命周期的方法都不用去复写了,他全部都帮你做了。

 

 

 

△IntentService使用说明:

IntentService将会自动完成以下工作

→新建一个默认的”workerthread”线程(就是他会新建一个子线程啦),这个服务要完成的所有任务(每次调用startService(intent)表示一个新的任务,每次向服务传进来一个Intent对象,都认为是传来一次任务)都在子线程里面去完成。而且他自始至终只有一个子线程。

→增加一个任务队列,每次只会向onHandleIntent()传入一个Intent,所以你就不用担心多线程的并发运行所导致的危险,因为他保证了不会发生多线程的并发。

→当所有的请求都被处理完了,他将自动结束服务,所以你也不用调用stopSelf()方法。其实这个类会自动管理服务生命周期,你压根就不用复写任何生命周期方法。

→自动为onBind()方法提供一个默认的返回值(null)。

→通过继承他来创建服务,你只需要做两件事:复写onHandleIntent()方法、提供一个空参数的构造方法。其中,onHandleIntent()方法就是你的服务所要做的所有事情,而且,启动服务时的那个Intent也在这里获得。空参数的构造方法里面要写你当前的服务类名。

→如果你通过继承这个类创建服务,你最好不要去复写他的生命周期方法。这个类有很完善的生命周期管理。

→小结:

(1)他的工作过程总结如下:每当他被启动一次,他会自动创建一个独立于主线程的子线程;所有任务都在子线程里进行;自始至终他都只开一个子线程,所有任务顺序执行(如果在服务完成了第一次工作之前,你又启动一次服务,两次工作不是并发执行,而是一个结束之后另外一个才能开始);他会自动控制服务的生命周期,一旦任务完成之后,自动销毁服务实例。

(2)如果你还想去复写服务的其他生命周期方法,记得要在每个生命周期方法里面调用超类方法,这样IntentService()才能管理好worker线程的生命周期。(例外:onBind方法也不用你调用超类方法)。

(3)优缺点:

`他只开了一个线程,所有任务按部就班运行,后面来的必须等到前面结束,所以,他避免了多线程的不安全性,同时,他也不支持多线程并发执行。

一个Intent的任务结束了以后(就是你调用一次startService()),如果没有新的Intent传入,服务将会自动结束(就是会将已创建的服务对象销毁),这意味着,如果你当前的任务与上一次任务中的相关状态有关,你是无法获取上次任务相关状态(因为上一次任务的对象已经销毁,所有成员变量全都清零)。

 

 

△  IntentService的创建与启动:

→通过继承IntentService来创建服务,你只需要复写两个方法即可,如下图示。

注意:构造方法里面所传入得是你这个类的类名。

 

 

→上图中的那个服务,你可以通过下面的语句来启动它。

 

 

 

△Service的使用说明:很多都是相对于”IntentService”而言的。

       →你需要自己去管理他的生命周期方法。

→这个类可以进行多线程并发执行任务。

→这个类的服务不会自动结束,当你确定你的服务不会接受新的任务,你需要手动将他结束掉。否则他将永无止境地存活着(除非某些特定情况下系统将他杀死)。

 

△Service的创建与启动:

→根据你的需要复写生命周期方法:

 


→启动方式是一样的:

 

△与你所启动的服务通信

→每当你调用一次startService(intent)方法,你就相当于跟服务通信,可以通过Intent传递数据给服务。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值