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. jsp页面展示更加商品的分类,控制商品的显示

    我的大概思路是这样的,第一后果获取所有的商品分类 保存在list集合里面,第二从后台获取所有的商品 第三在JSP页面遍历商品分类集合放在页面的左边,然后jsp页面商品详细信息这块,也得先遍历商品分类, ...

  2. 【转】ERP系统测试方法

    问题: 1.如何进行ERP系统测试用例设计? 2.ERP系统测试用例设计过程? 3.ERP系统测试用例设计的方法?    ERP系统本身是一种业务流程很复杂,单据报表众多,逻辑性很强的系统,质量保证方 ...

  3. 实现JSP部分内容继承

    我们的网站框架搭好以后,只需要主体部分显示不同的数据. 如果每次代码重写都会造成冗余. 今天欣赏别人代码,学到了 maven 核心代码 <dependency> <groupId&g ...

  4. 解题报告:luogu P5543 [USACO19FEB]The Great Revegetation S

    题目链接:P5543 [USACO19FEB]The Great Revegetation S 好坑啊,都身败名裂了. 思路一: 考虑染色法,跑一遍搜所就好了,不给代码了. 思路二: 考虑并查集,我想 ...

  5. R语言 table()函数

    table函数 用 table() 函数统计因子各水平的出现次数(称为频数或频率).也可以对一般的向量统计每个不同元素的出现次数.如 sex = c("女","女&quo ...

  6. Java日志介绍(2)-Log4j

    Log4j是Apache的一个开源项目,官网地址为http://logging.apache.org/log4j/1.2/index.html.通过使用Log4j,可控制日志信息输出到控制台.文件.数 ...

  7. 143、Java内部类之访问方法中定义的参数或变量

    01.代码如下: package TIANPAN; class Outer { // 外部类 private String msg = "Hello World !"; publi ...

  8. leetcode209 Minimum Size Subarray Sum

    """ Given an array of n positive integers and a positive integer s, find the minimal ...

  9. 【剑指Offer面试编程题】题目1389:变态跳台阶--九度OJ

    题目描述: 一只青蛙一次可以跳上1级台阶,也可以跳上2级--它也可以跳上n级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 输入: 输入可能包含多个测试样例,对于每个测试案例, 输入包括一个整数n(1 ...

  10. Android 如何从系统图库中选择图片

    转:http://blog.csdn.net/tody_guo/article/details/7560270 这几天我都在做Android的App,同时学习它的API,我将分享一些我学到的东西,比如 ...