Service概念及用途:
A service is an application component that can perform long-running operations in the background and does not provide a user interface。
通常service用来执行一些耗时操作,或者后台执行不提供用户交互界面的操作,例如:下载、播放音乐。
Service生命周期 :
Android Service的生命周期并不像Activity那么复杂,它只继承了onCreate(),onStart(),onDestroy()三个方法,当我们第一次启动Service时,先后调用了onCreate(),onStart()这两个方法,当停止Service时,则执行onDestroy()方法,这里需要注意的是,如果Service已经启动了,当我们再次启动Service时,不会在执行onCreate()方法,而是直接执行onStart()方法,具体的可以看下面的实例。
Service与Activity通信:
Service后端的数据最终还是要呈现在前端Activity之上的,因为启动Service时,系统会重新开启一个新的进程,这就涉及到不同进程间通信的问题了(AIDL)这一节我不作过多描述,当我们想获取启动的Service实例时,我们可以用到bindService和onBindService方法,它们分别执行了Service中IBinder()和onUnbind()方法。
这里要提及一点:继承service的子类在重写service的方法中,除了一个onStart()方法之外,还有一个onStartCommand()方法,有关onStartCommand()方法稍微作点介绍:
Android开发的过程中,每次调用startService(Intent)的时候,都会调用该Service对象的onStartCommand(Intent,int,int)方法,然后在onStartCommand方法中做一些处理。然后我们注意到这个函数有一个int的返回值,这篇文章就是简单地讲讲int返回值的作用。
从Android官方文档中,我们知道onStartCommand有4种返回值:
START_STICKY:如果service进程被kill掉,保留service的状态为开始状态,但不保留递送的intent对象。随后系统会尝试重新创建service,由于服务状态为开始状态,所以创建服务后一定会调用onStartCommand(Intent,int,int)方法。如果在此期间没有任何启动命令被传递到service,那么参数Intent将为null。
START_NOT_STICKY:“非粘性的”。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统将会把它置为started状态,系统不会自动重启该服务,直到startService(Intent intent)方法再次被调用;。
START_REDELIVER_INTENT:重传Intent。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统会自动重启该服务,并将Intent的值传入。
START_STICKY_COMPATIBILITY:START_STICKY的兼容版本,但不保证服务被kill后一定能重启。
有了 Service 类我们如何启动他呢,有两种方法:
• Context.startService()
• Context.bindService()
1. 在同一个应用任何地方调用 startService() 方法就能启动 Service 了,然后系统会回调 Service 类的 onCreate() 以及 onStart() 方法。这样启动的 Service 会一直运行在后台,直到 Context.stopService() 或者 selfStop() 方法被调用。另外如果一个 Service 已经被启动,其他代码再试图调用 startService() 方法,是不会执行 onCreate() 的,但会重新执行一次 onStart() 。
2. 另外一种 bindService() 方法的意思是,把这个 Service 和调用 Service 的客户类绑起来,如果调用这个客户类被销毁,Service 也会被销毁。用这个方法的一个好处是,bindService() 方法执行后 Service 会回调上边提到的 onBind() 方发,你可以从这里返回一个实现了 IBind 接口的类,在客户端操作这个类就能和这个服务通信了,比如得到 Service 运行的状态或其他操作。如果 Service 还没有运行,使用这个方法启动 Service 就会 onCreate() 方法而不会调用 onStart()。
区别概况为:
startService() 的调用者与服务没有联系,即使调用者退出了,服务仍然运行,而bindService() 的调用者与服务绑在一起,调用者一旦退出了,服务也随即终止掉。
分享到:
相关推荐
Service 启动与停止
android学习之Service启动1
start service 启动不了解决方案
Linux中jar使用service启动脚本
知识点:广播必须在activity或者service启动之后才能发挥作用。个人看来是因为开启activity或者service时, AndroidManifest.xml里面的注册的广播或者在Activity、service动态注册的广播接收器才能被开启,这样才能...
C# 开机启动服务(windows service) 本程序用ASP.NET C#开发,不针对系统版本限制。 本源码拿就来可以直接写您想要的服务,无需再改其它的代码,拿来主义是不是很好?例如订单服务。 本服务是100%源码,源码中包含: ...
Network List Service不能启动解决方案 Network List Service不能启动解决方案
tengine以service方式进行启动,默认安装。直接make&& make install后默认路径启动安装,如果路径有变动,请自行修改
主要为大家详细分析了Android Service启动完整过程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
在Linux系统下配置service启动和关闭 1, 通过命令cd /etc/init.d文件夹下 2, 再通过命令 vim tomcat 进入vim编辑界面 3,用过 i键 现在把下面代码贴入编辑界面 shell脚本如下 #!/bin/bash # This is the ...
一款简单的映月播放器demo,采用startService启动模式,实现了常用的播放功能.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
Android系统在新进程中启动自定义服务过程(startService)的原理分析
不要忘了,Android的四大组件中,有一个Service。它的功能类似于Activity,只是Service是在后台工作,不出现在用户的视野中。当我们在前台上进行一个人机交互操作,让这个操作关联到Service上,这样,我们就能够解决...
一个小demo,通过求平均值,测试service的生命周期以及启动方式!
NULL 博文链接:https://410063005.iteye.com/blog/1941314
主要介绍了docker.service启动失败:Unit not found的原因分析及解决办法,需要的朋友可以参考下
Tomcat 7 Windows中以Service方式启动配置启动参数
2.编写启动脚本内容 #!/bin/bash #chkconfig: 2345 10 90 #description: test service .... LANG=en_US.UTF-8 #设置编码utf-8 export LANG export JAVA_HOME=/usr/java/jdk1.8.0_231-amd64 export JRE_HOME=/$JAVA_...
QtService是一个用于实现windows服务或unix守护进程的开源项目,下载地址 本文使用QtService演示如何实现一个windows下的后台进程,可用于一些简单的windows服务程序中。 博客介绍:...