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. 线性表顺序存储_List

    #include "stdafx.h" #include "stdio.h" #include "stdlib.h" #include &q ...

  2. redis 之redis集群与集群配置

    一.为什么要用集群 redis3.0集群采用P2P模式,完全去中心化,将redis所有的key分成了16384个槽位,每个redis实例负责一部分slot,集群中的所有信息通过节点数据交换而更新. r ...

  3. netsh命令获取wifi历史连接密码

    首先[win+r]快捷键打开运行,输入cmd.或点击左下角win-运行-cmd 1.netsh wlan show profiles //列出所有的ap名称 2.netsh wlan show pro ...

  4. Django链接MySQL,数据库迁移

    form表单默认是以get请求提交数据的 http://127.0.0.1:8000/login/?username=admin&password=123 action 1 不写,默认向当前地 ...

  5. 彻底搞懂 JS 中 this 机制

    彻底搞懂 JS 中 this 机制 摘要:本文属于原创,欢迎转载,转载请保留出处:https://github.com/jasonGeng88/blog 目录 this 是什么 this 的四种绑定规 ...

  6. CSS相关(1)

    CSS: 字体: 网页默认字体16px; 网站通用字体大小14px 最小是12px,最大无限大 单位换算:1em=16px 选择器:标签选择器:选择页面中所有指定标签,权重为1 通配符选择器:选择所有 ...

  7. jQuery EasyUI window窗口实例

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>j ...

  8. 《C++ Primer(中文版)(第5版)》斯坦利·李普曼 (Stanley B. Lippman) (作者), 约瑟·拉乔伊 (Josee Lajoie) (作者), 芭芭拉·默 (Barbara E. Moo) (作者) azw3

    内容简介: 这本久负盛名的C++经典教程,时隔八年之久,终迎来的重大升级.除令全球无数程序员从中受益,甚至为之迷醉的——C++ 大师 Stanley B. Lippman 的丰富实践经验,C++标准委 ...

  9. 奇异值分解(SVD)和主成分分析(PCA)

    参考: 奇异值分解:https://www.cnblogs.com/endlesscoding/p/10033527.html 主成分分析:https://blog.csdn.net/program_ ...

  10. 「CF161B」Discounts

    传送门 Luogu 解题思路 贪心地想一想,我们肯定要让凳子去给价格越高的商品打半价,那么我们就先按照价格排序,但是要优先把凳子排在前面. 然后我们发现一条凳子肯定只能给价格小于等于它本身的物品打半价 ...