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。

    1. 定义一个类继承Service
    2. 在Manifest.xml文件中配置该Service
    3. 使用Context的startService(Intent)方法启动该Service
    4. 不再使用时,调用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才能被销毁。

    1. 创建BindService服务端,继承自Service并在类中创建一个实现IBinder接口的实例对象,它可以提供公共方法给客户端调用。
    2. 从onBind()回调方法返回这个IBinder实例。
    3. 然后在客户端绑定服务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总结的更多相关文章

  1. 通过AngularJS实现前端与后台的数据对接(二)——服务(service,$http)篇

    什么是服务? 服务提供了一种能在应用的整个生命周期内保持数据的方法,它能够在控制器之间进行通信,并且能保证数据的一致性. 服务是一个单例对象,在每个应用中只会被实例化一次(被$injector实例化) ...

  2. Azure Service Fabric 开发环境搭建

    微服务体系结构是一种将服务器应用程序构建为一组小型服务的方法,每个服务都按自己的进程运行,并通过 HTTP 和 WebSocket 等协议相互通信.每个微服务都在特定的界定上下文(每服务)中实现特定的 ...

  3. 无法向会话状态服务器发出会话状态请求。请确保 ASP.NET State Service (ASP.NET 状态服务)已启动,并且客户端端口与服务器端口相同。如果服务器位于远程计算机上,请检查。。。

    异常处理汇总-服 务 器 http://www.cnblogs.com/dunitian/p/4522983.html 无法向会话状态服务器发出会话状态请求.请确保 ASP.NET State Ser ...

  4. C#创建、安装、卸载、调试Windows Service(Windows 服务)的简单教程

    前言:Microsoft Windows 服务能够创建在它们自己的 Windows 会话中可长时间运行的可执行应用程序.这些服务可以在计算机启动时自动启动,可以暂停和重新启动而且不显示任何用户界面.这 ...

  5. java中Action层、Service层和Dao层的功能区分

    Action/Service/DAO简介: Action是管理业务(Service)调度和管理跳转的. Service是管理具体的功能的. Action只负责管理,而Service负责实施. DAO只 ...

  6. 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 [ ...

  7. Android—Service与Activity的交互

    service-Android的四大组件之一.人称"后台服务"指其本身的运行并不依赖于用户可视的UI界面 实际开发中我们经常需要service和activity之间可以相互传递数据 ...

  8. angularjs 1 开发简单案例(包含common.js,service.js,controller.js,page)

    common.js var app = angular.module('app', ['ngFileUpload']) .factory('SV_Common', function ($http) { ...

  9. IIS启动失败,启动Windows Process Activation Service时,出现错误13:数据无效 ;HTTP 错误 401.2 - Unauthorized 由于身份验证头无效,您无权查看此页

    因为修改过管理员账号的密码后重启服务器导致IIS无法启动,出现已下异常 1.解决:"启动Windows Process Activation Service时,出现错误13:数据无效&quo ...

  10. 如何利用mono把.net windows service程序迁移到linux上

    How to migrate a .NET Windows Service application to Linux using mono? 写在最前:之所以用要把windows程序迁移到Linux上 ...

随机推荐

  1. oracle连接种类

    等连接:连接条件使用等号 非等连接:连接条件使用等号以外的其它符号 内连接:根据指定的连接条件进行连接查询,满足连接条件的数据才会出现在结果集 外连接:在内连接的基础上,将某个连接表不符合连接条件的记 ...

  2. navicat12破解详细教程

    以管理员身份运行此注册机: 运行注册机 打开注册机后,1) Patch勾选Backup.Host和Navicat v12,然后点击Patch按钮: 默认勾选 找到Navicat Premium 12安 ...

  3. 关于and 和or的执行优先级问题分析

    题目:列出本店价低于60或者高于100.并且商品点击数大于628的商品. 按照下面两种写法,得到的结果是不同的. 第一种:结果数据中有点击数为628的记录,显然不符合题目要求. SELECTgoods ...

  4. 02-06Android学习进度报告六

    今天学习了关于Android开发中常用的两个知识,即对话框和悬浮框. 首先我学习了对话框的基本使用流程 Step 1:创建AlertDialog.Builder对象: Step 2:调用setIcon ...

  5. Linux (Ubuntu) 服务器安装MySQL,设置不限ip,root远程密码访问

    1.注释bind-address = 127.0.0.1 sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf   将bind-address = 127.0.0.1 ...

  6. 将图片转化为base64编码字符串

    pom依赖 <dependency> <groupId>org.ops4j.base</groupId> <artifactId>ops4j-base- ...

  7. 跳转连接转base64

    //配置H5连接 @Value("${h5.domain}") private String h5Domain; // 校验商家端权限 public String checkSta ...

  8. The way get information from mssql by using excel vba and special port

    Yes,  we can get information from mssql by using excel vba.  But the default port of MSSQL is  1433. ...

  9. Celeste 机制研究

    0. 简介.惯例.总论 Celeste (塞莱斯特) 是一个具有优秀手感的平台跳跃游戏. 虽然操作所使用的按键很少, 但是却有着复杂的组合机制. 在游戏实现上, Celeste 是一个锁定 60 帧 ...

  10. Kubernetes 的一些重要概念

    Cluster Cluseter 是计算.存储和网络资源的集合,Kubernetes 利用这些资源运行各种基于容器的应用. Master Master 是 Cluster 的大脑, 它的主要责任是调度 ...