Broadcast Android Service Android Launcher Android Widget Android NDK NDK初探

android service生命周期



Service生命周期

 

android1.png 


左边是starService的生命周期,右边bindSrvice的生命周期。


1.context.startService() 启动流程(后台处理工作):


context.startService()  -> onCreate()  -> onStartCommand()  -> Service running  -> context.stopService()  -> onDestroy()  -> Service stop

 

所以调用startService的生命周期大致为:onCreate(只在创建的时候调用一次直到被摧毁) --> onStartCommand (服务开启后,可多次调用) --> onDestroy。starService是怎样运行的,onCreate()  -> onStartCommand()  ->之后Service就正常启动了,最后onDestroy()。也就是说就三个方法。服务中的onStartCommand(Intent intent, int flags, int startId)方法会返回一个唯一的整数标识符来识别启动请求,启动请求可以是START_STICKY、START_STICKY_COMPATIBILITY、START_NOT_STICKY、START_REDELIVER_INTENT等,标志位可以是START_FLAG_REDELIVERY、START_FLAG_RETRY。通过这种方式,服务并不会随着绑定组建的摧毁而摧毁,而是服务自我摧毁。(所以这种方式适用于文件下载,上传等请求自行运行的场景)。

 

从图中我们可以看出,onCreate方法只在创建时候被调用了一次,这说明:Service被启动时只调用一次onCreate()方法,如果服务已经被启动,在次启动的Service组件将直接调用onStartCommand()方法,通过这样的生命周期,可以根据自身需求将指定操作分配进onCreate()方法或onStartCommand()方法中。


2.context.bindService()启动流程(在本地同一进程内与Activity交互):

 

context.bindService()  -> onCreate()  -> onBind()  -> Service running  -> onUnbind()  -> onDestroy()  -> Service stop

 

bindService的生命周期简化为为:onCreate --> onBind --> onUnbind --> onDestory。bindSrvice起动顺序,onCreate()  -> onBind()  ->就启动了,当消亡的时候调用,onUnbind()  ->就取消绑定,然后onDestroy()  ->通过该方法,服务启动时会调用onCreate()来启动服务,可是它不会调用onStartCommand() 方法,并且只有在所有的服务都接触了后,服务才会自动停止运行。通过服务的onBind()方法,可以获的一个客户端与服务器进行通信的IBdiner接口。IBind允许客户端回调服务的方法,比如得到Service的实例、运行状态或其他操作。这个时候把调用者(Context,例如Activity)会和Service绑定在一起,Context退出了,Srevice就会调用onUnbind->onDestroy相应退出。

注:绑定服务的Android组建在摧毁前应解除绑定,否则会造成内存泄漏。

 

尝试去写一个服务,建立一个服务。


android2.png 


继承一个Service的类。


android3.png 


官网说明,建立一个Started Service,首先要去实现我们的Service


android4.png 


建立一个Started Service把所有的生命周期都打出来


android5.png 


这里面有两条生命线首先是startService(),先onCreate(只在创建的时候调用一次直到被摧毁) --> onStartCommand (服务开启后,可多次调用) --> onDestroy非常简单。

 

所以我们现在在这个Service里面,就来尝试着建立一个Service。

startService()首先建立Service类,建完了类之后,在AndroidMainfest.xml文件中配置注册该Service。


android6.png 


然后就需要在Service中定义到底提供什么样的服务。创建一个HelloService方法,在里面调用一个循环不断地打Log,每次打Log间隔一秒钟。引入一个try-catch。


android7.png 


这个方法会被onStartCommand调用,这个方法会传过来当我们的方法被调用了之后它就会启动onStartCommand这样的一个重载方法,这里面会传第一个,intent,这个intent就是我们刚刚在Service里面要传的intent。

flags 就是一些标识


android8.png 


Flags的一些标识就是0,1这样的标识,每个标识都有含义。

第三个是starid就是启动id就是我们每次服务启动的时候都会有一个唯一的id,我们每个服务都有唯一的id,每个任务都会有一个唯一的id,他还有一个返回值


android9.png 


返回他也会去返回到我们当前启动的状态,那么默认情况下他推荐我们用start sticke。

我们就用系统默认返回的。

接下来调用传进来的HelloService方法就可以了


android10.png 


这样最简单的服务就定义好了。

定义好了之后要去调用它。

启动服务startService(service),传入的也是个Intent对象,第一个当前的上下文,第二个是我们服务的类。


android11.png 


启动程序;


android12.png 


开始打印Log。

当然由于刚刚所做的测试,是运行在主线程里面的


android13.png 


所以我们现在也是在阻塞界面,最后服务器算是跑起来了。

总结startService是怎么来做的。



【本文由麦子学院独家原创,转载请注明出处并保留原文链接】

logo
© 2012-2016 www.maiziedu.com
蜀ICP备13014270号-4 Version 5.0.0 release20160127

麦子大聚惠,豪华礼包你领了吗?

客服热线 400-862-8862

回到顶部