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. Kali Linux RPi0w Nexmon操作笔记

    Kali Linux RPi0w Nexmon镜像下载地址:https://www.offensive-security.com/kali-linux-arm-images/ 1.烧录系统 可参考:树 ...

  2. day11 作业

    # 1.编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件), # 要求登录成功一次,后续的函数都无需再输入用户名和密码 # FLAG = False # def login(func): ...

  3. 【PAT甲级】1010 Radix (25 分)(二分)

    题意: 输入两个数可能包含小写字母,1或者2,进制大小.第三个数为代表第一个数是第四个数进制的,求第二个数等于第一个数时进制的大小,不可能则输出Impossible,第三个数为2代表第二个数是第四个数 ...

  4. CentOS7中下载安装Multitail(让你的日志文件变得多彩)

    MultiTail是干啥的? Linux系统下查看日志的一个工具,允许您监视终端中多个窗口中的日志文件和命令输出,着色,过滤和合并. 具体介绍请看官网:https://www.vanheusden.c ...

  5. zookeeper和eureka的区别在哪?

    zookeeper和eureka的区别在哪?传统的关系型数据库是ACID(原子性,一致性,独立性,持久性), nosql数据库是CAP(强一致性,可用性,分区容错性),分布式系统只能3进2,三个选两个 ...

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

  7. angular 自定义服务封装自定义http请求

    在angular中将http请求,放置在一起封装成服务,可减少代码重复,方便使用 var ngpohttprest = angular.module('ngpohttprest', []); ngpo ...

  8. 学习Java的书籍资料

    对于程序员来说,编程技术至关重要,然而技术的提高不是一蹴而就的,它需要时间的积累和经验的沉淀.因此本文为大家推荐Java学习的书籍,学虽容易,学好不易,且学且珍惜. 基础类.<Java从入门到精 ...

  9. 「SDOI2013」森林

    「SDOI2013」森林 传送门 树上主席树 + 启发式合并 锻炼码力,没什么好说的. 细节见代码. 参考代码: #include <algorithm> #include <cst ...

  10. 网络请求中的URL中传bool型数据

    如果在URL中要拼接bool的数据,OC这边不能使用BOOL型.因为使用NSString的拼接字符串类方法中,会将BOOL型数据转化为0或者1. 解决办法: NSString *overdue_str ...