Service总结
Service
Service的应用场景,以及和Thread区别
开启Service的两种方式以及区别
Service基础
Service是什么?
Service(服务)是一个可以在后台长时间运行而没有用户界面的应用组件。可以由其他的应用组件比如Activity、Broadcast启动,Service一旦被启动后就会一直在后台运行,即使启动它的Activity或者Broadcast都已经被销毁Service也不会受到影响。另外还可以把Service绑定到Activity,可以让Service和Activity进行数据交互,甚至Service和Activity可以是在不同的进程,这时通过进程间通信来进行数据传输。其中Service和广播Broadcast都运行在主线程当中,内部都不能做耗时操作!
Service和Thread的区别
首先,Service和Thread没有关系,是两个概念。
定义
Thread是程序执行的最小单元,是分配CPU的基本单位,可以用来执行一些异步操作等等;而Service它是Android当中的一种机制,当它运行的时候,如果是本地服务Local Service那么就是运行在主线程上,绝对不能做耗时操作,也就是说Thread的运行时相对独立的,而Service的运行是依托于它所在的主线程上,相比于Thread,Service的独立性没有那么强了。其实两者没有什么关系,我们不能把后台和子线程的概念搞混,服务和后台也是不同的概念,Android当中的后台指的是它的运行不依赖于UI,即使Activity被销毁了或者程序关闭了,这个服务进程仍然存在,它会一直在后台进行一些计算啊或者数据统计相关的内容。如果一定要在Service里面添加耗时操作也一定要开启子线程去处理耗时操作。
那为什么既然Service处理耗时操作需要开启线程为什么不直接在Activity当中开启子线程呢?因为Activity很难对Thread进行控制,当Activity被销毁了就很难有办法获取已经开启的子线程的实例的引用!而Service来处理后台任务,Activity就可以很放心地被销毁,不用担心对后台任务的控制了。
实际开发
在Android当中,线程一般指的是工作线程,也就是后台线程,做一些耗时操作;而主线程只是负责处理一些UI绘制,为了及时响应绝对不能够做耗时操作。
而Service是Android四大组件之一,一般情况下是运行在主线程当中,不能够做耗时操作,否则系统会报ANR异常,之所以称Service为后台服务就是因为它没有UI界面,用户无法感知,但是它是在后台运行了一些数据,所以说如果一定要在Service当中进行耗时任务就一定要开启子线程。
应用场景
而Service需要长时间在后台运行而且不需要交互,比如在后台播放音乐或者数据统计等等。当一定要处理网络或者IO操作等等耗时操作的时候都应该开启子线程的方式保证UI线程不被占用,不影响用户体验。
两种启动Service的方式
startService
就是通过Activity调用startService(intent)启动服务,一旦服务开启就一直在后台运行,即是启动它的Activity被销毁了也对Service的运行没有影响,除非是手动的关闭这个Service。
- 定义一个类继承Service
- 在Manifest.xml文件中配置该Service
- 使用Context的startService(Intent)方法启动该Service
- 不再使用时,调用stopService(Intent)方法停止该服务。
MyService()
MyService onCreate()//只会在创建Service时调用一次
MyService onStartCommand()
MyService onDestroy()
bindService
启动Service以后和Activity属于绑定状态,绑定服务后会提供给一个客户端服务端接口,就相当于Activity和Service交互的接口,Activity和Service进行数据交互,发送请求获取结果等等操作,甚至Service和Activity在不同进程中时,可以进行进程间通信来传输数据。这些是需要在Service和Activity绑定之后才能使用的,同时,多个Activity可以绑定同一个Service,绑定全部取消以后,服务就会自动被销毁,并不一定要像startService的方式一样使用stopService才能被销毁。
- 创建BindService服务端,继承自Service并在类中创建一个实现IBinder接口的实例对象,它可以提供公共方法给客户端调用。
- 从onBind()回调方法返回这个IBinder实例。
- 然后在客户端绑定服务bindService(intent, connection, Context.BIND_AUTO_CREATE),绑定成功后就可以从ServiceConnection#onServiceConnected()回调方法接收Binder对象,通过这个Binder对象就可以使用Service当中提供的方法了。
MyService()
MyService onCreate()
onBind()
onServiceConnected()
onUnbind()
MyService onDestroy()
Service回调方法
onBind()在bindService时才会被调用。
onCreate()Service首次创建,在调用onStartCommand或者onBind之前,会被调用一次,如果已经运行了就不会再被调用了。
onStartCommand()通过startService启动Service的时候会回调,执行了这个方法,Service就正式开启了。
onDestory()Service被销毁时回调,可以进行一些资源的清理,比如说子线程或者是监听器进行回收等等。
Service总结的更多相关文章
- 通过AngularJS实现前端与后台的数据对接(二)——服务(service,$http)篇
什么是服务? 服务提供了一种能在应用的整个生命周期内保持数据的方法,它能够在控制器之间进行通信,并且能保证数据的一致性. 服务是一个单例对象,在每个应用中只会被实例化一次(被$injector实例化) ...
- Azure Service Fabric 开发环境搭建
微服务体系结构是一种将服务器应用程序构建为一组小型服务的方法,每个服务都按自己的进程运行,并通过 HTTP 和 WebSocket 等协议相互通信.每个微服务都在特定的界定上下文(每服务)中实现特定的 ...
- 无法向会话状态服务器发出会话状态请求。请确保 ASP.NET State Service (ASP.NET 状态服务)已启动,并且客户端端口与服务器端口相同。如果服务器位于远程计算机上,请检查。。。
异常处理汇总-服 务 器 http://www.cnblogs.com/dunitian/p/4522983.html 无法向会话状态服务器发出会话状态请求.请确保 ASP.NET State Ser ...
- C#创建、安装、卸载、调试Windows Service(Windows 服务)的简单教程
前言:Microsoft Windows 服务能够创建在它们自己的 Windows 会话中可长时间运行的可执行应用程序.这些服务可以在计算机启动时自动启动,可以暂停和重新启动而且不显示任何用户界面.这 ...
- java中Action层、Service层和Dao层的功能区分
Action/Service/DAO简介: Action是管理业务(Service)调度和管理跳转的. Service是管理具体的功能的. Action只负责管理,而Service负责实施. DAO只 ...
- org.jboss.deployment.DeploymentException: Trying to install an already registered mbean: jboss.jca:service=LocalTxCM,name=egmasDS
17:34:37,235 INFO [Http11Protocol] Starting Coyote HTTP/1.1 on http-0.0.0.0-8080 17:34:37,281 INFO [ ...
- Android—Service与Activity的交互
service-Android的四大组件之一.人称"后台服务"指其本身的运行并不依赖于用户可视的UI界面 实际开发中我们经常需要service和activity之间可以相互传递数据 ...
- angularjs 1 开发简单案例(包含common.js,service.js,controller.js,page)
common.js var app = angular.module('app', ['ngFileUpload']) .factory('SV_Common', function ($http) { ...
- IIS启动失败,启动Windows Process Activation Service时,出现错误13:数据无效 ;HTTP 错误 401.2 - Unauthorized 由于身份验证头无效,您无权查看此页
因为修改过管理员账号的密码后重启服务器导致IIS无法启动,出现已下异常 1.解决:"启动Windows Process Activation Service时,出现错误13:数据无效&quo ...
- 如何利用mono把.net windows service程序迁移到linux上
How to migrate a .NET Windows Service application to Linux using mono? 写在最前:之所以用要把windows程序迁移到Linux上 ...
随机推荐
- Java基础 -2.3
浮点数类型 所有的数据类型进行自动转型的时候都是由小类型到大类型进行自动转换处理.默认的类型为double,但是也可以定义位数相对较少的float变量 ,此时从赋值的时候就必须采用强制类型转换 pub ...
- 发送邮件#Python
import yagmailusername='11@qq.com' #发件人邮箱qq='zhezlqiggd' #授权码,QQ邮箱可在设置账户获得mail_server='smtp.qq.com' ...
- 华为云WeLink 颠覆你对智能办公的想象
导读 华为云发现,与企业数字化关系最紧密的就是办公数字化,所以将WeLink放到华为云上可以作为一个抓手让企业更直观地感受到云端数字化,而且华为云的合作伙伴,也可以与WeLink建立联接,从而进整个企 ...
- nacos作为配置中心兼容xml配置文件
最近公司想要用配置中心,因为公司用的有传统的spring项目,有springboot项目,为了兼容都能够采用配置中心,做了一些尝试,经过比较还是倾向于使用nacos,传统dubbo采用spring方式 ...
- 「Luogu P3168 [CQOI2015]任务查询系统」
介绍本题的两种做法: 方法1 前置芝士 线段树:一个很重要的数据结构. 树状数组:一个很重要的数据结构. 具体实现 区间修改,单点查询很容易就会想到树状数组了,至于查询前k个数的和又可以丢给权值线段树 ...
- 怎么样运行jar
一.制作jar文件 在制作.jar 文件之前你必须先编译好你的.java文件.假设我们的文件目录是c:javamyJavahelloHello.java 现在假设Hello.java的文件内容为: / ...
- 清除编译缓存DerivedDate
当多次重构工程造成代码没有错误却编译失败时,可以尝试删除DerivedData目录.DerivedData目录是Xcode的编译缓存,路径是~/Library/Developer/Xcode/Deri ...
- 十六 Spring的JDBC模版入门,默认连接池
Spring是EE开发一站式框架,有EE开发的每层的解决方案,Spring对持久层也提供了解决方案:ORM模块和JDBC的模版
- 暴强贴:从.NET平台调用Win32 API----转载
水之真谛 关注 17人评论 27649人阅读 2007-02-28 17:03:47 作者:刘铁猛日期:2005-12-20关键字:C# .NET Win32 API 版权声明:本文章受知识产权法 ...
- 今日份学习: Spring - 事实标准
笔记 Spring IOC Inverse of Control:控制反转 DI:Dependancy Injections:依赖注入 没有IOC的时候,各种依赖需要逐个按顺序创建. 有了IOC的之后 ...