1.什么是Service?

A Service is an application component representing either an application's desire to perform a longer-running operation while not interacting with the user or to supply functionality for other applications to use.(服务是一个应用程序组件,要么满足在一个应用程序中长期后台运行但是不和用户交互的需求,要么给其它的应用程序提供功能。)

2.Service的两大特点:

1):长期后台运行。

2):没有界面。

3.为什么要用Service而不用Thread了?

我们知道用new Thread(){}.start();的方式开启的子线程也是没有界面且长期后台运行的。那当我们想要满足服务的第一个功能时,为什么不直接使用开启一个新的线程的方式了?

这个问题可以从Android系统进程管理的方面来回答。Android系统中应用程序一旦被打开,通常情况下退出应用程序,即清空了任务栈后,该应用程序的进程并不会停止,而是以一个空进程的状态存在着,这是为了方便下一次快速启动(应用程序启动时间的长短是一个很重要的性能指标)。但是这样的管理机制会带来一个问题,那就是对内存的过度消耗。随着系统的运行,会出现内存不足的问题。Android系统有一套内存清理机制。 按照优先级去回收系统的内存。

进程分为5个等级的优先级:(从高到低)

1.Foreground process           前台进程   用户正在操作的应用程序对应的进程(获得焦点)

2.Visible process                  可视进程   用户仍然可以看到这个进程的界面(失去焦点)。

3.Service process                 服务进程   应用程序有一个服务组件在后台运行。

4.Background process           后台进程  应用程序没有服务在运行 并且最小化 (activity onstop)。

5.Empty process                  空进程     应用程序退出,没有任何运行的activity, 任务栈空了。

当一个新的进程被创建或者正在运行的进程请求新的内存资源,但是系统内存不足时,按上面的优先级由高到低依次回收内存,以满足新提出的内存需求。如果是直接new 出来的线程,当应用程序退出时,其被回收的优先级是5,是最先被回收的。因而长期后台运行的组件, 我们不应该在activity中开启子线程。而是应该要创建服务,在服务里面开启子线程。这样既能保证长期后台运行,又能提高进程的优先级,系统不容易回收掉进程,即便回收了,内存充足的时候,进程又会被重新创建。

 

为什么用服务不用线程-Android的更多相关文章

  1. Android系统Surface机制的SurfaceFlinger服务的线程模型分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8062945 在前面两篇文章中,我们分析了Sur ...

  2. IntentService 服务 工作线程 stopself MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  3. 使用Struts2服务端与android交互

    转自:http://www.cnblogs.com/android-html5/archive/2011/09/25/2534107.html android--使用Struts2服务端与androi ...

  4. Python中的Tcp协议应用之TCP服务端-线程版

    利用线程实现,一个服务端同时服务多个客户端的需求. TCP服务端-线程版代码实现: import socket import threading def handle_client_socket(ne ...

  5. Android进程和线程(Android开发指南--译)

    (转自:http://www.cnblogs.com/xitang/archive/2011/09/24/2189460.html) Processes and Threads 译者署名: 呆呆大虾 ...

  6. Android客户端与PC服务端、android服务端通过WiFi通信

    前期准备:我的是Linux Mint操作系统(总之折腾的过程中怀疑过是不是系统的问题),首先是要创建wifi热点给android手机使用,这个时候笔记本作为通信的服务器端,android手机作为客户端 ...

  7. html+css+js+Hbuilder开发一款安卓APP,根本不用学Android开发!

    我们知道,要做一款安卓APP,咱们得先学安卓开发语言,例如java,前端后端.那么没有这些开发语言基础,咱们怎么做呢?其实现在有比较好的开发方案就是做webAPP,咱们可以用web前端知识构建安卓客户 ...

  8. 微软开放技术开发了适用于 Windows Azure 移动服务的开源 Android SDK

     发布于 2014-02-10 作者 陈 忠岳 为进一步实现连接微软与非微软技术的目标,微软开放技术有限公司开发了适用于 Windows Azure 移动服务的 Android SDK,由Scot ...

  9. Delphi 编写系统服务(服务控制线程:开始,暂停,继续,停止)

    打开Delphi 7,新建,选择Other->Service Application 修改属性中Name和DisplayName,Name是Service的名称,决定着进程的标识,Display ...

随机推荐

  1. 一个获取文件绝对路径的sh

    脚本里有个获取文件绝对路径的需求,linux里有个很方便的realpath命令,但是mac下没有,甚至readlink -f也跟linux下的表现不同,所以……直接用pwd算了 #!/bin/bash ...

  2. netcdf入门(转)

    一.概述  NetCDF全称为network Common Data Format,中文译法为“网络通用数据格式”,对程序员来说,它和zip.jpeg.bmp文件格式类似,都是一种文件格式的标准.ne ...

  3. [RDLC]报表根据字段列动态加载图片(二)

    参照:http://www.cnblogs.com/hcbin/archive/2010/03/26/1696803.html 改动地方value的值可以用报表的字段进行编辑. 效果:

  4. Android程序开发0基础教程(一)

    程序猿学英语就上视觉英语网 Android程序开发0基础教程(一)   平台简单介绍   令人激动的Google手机操作系统平台-Android在2007年11月13日正式公布了,这是一个开放源码的操 ...

  5. 【JavaScript】理解与使用Javascript中的回调函数

    在Javascript中,函数是第一类对象,这意味着函数可以像对象一样按照第一类管理被使用.既然函数实际上是对象:它们能被“存储”在变量中,能作为函数参数被传递,能在函数中被创建,能从函数中返回. 因 ...

  6. linux文档编辑

    编辑某个文档: 可以直接编辑的如你有文档aa,可以用vi aa [注意:必须在AA所在的目录下]: 如果没有文档而且你又想编辑就可以直接编辑vi aa[名字你可以随便命名]; 也可以先建立一个文档to ...

  7. install root certificate failed, Please run as administrator/root/sudo

    在钥匙窜中导入  证书就可以了

  8. 对javascript this的理解

    对于this的理解,大部分时间都比较模糊,最近几天做了一些研究,记录一下 首先应该明白,this是执行上下文的一个属性,它的值取决于执行上下文,执行上下文和函数调用方式相关,定义一个function的 ...

  9. Android广播机制:Broadcast

    转载:Android总结篇系列:Android广播机制 1.Android广播机制概述 Android广播分为两个方面:广播发送者和广播接收者,通常情况下,BroadcastReceiver指的就是广 ...

  10. 被淡忘的c#析构函数

    析构函数在C#中已经很少使用了,以至于很多人已经把它淡忘了,虽然用处不大,研究一下也无防.(原文:http://bbs.csdn.net/topics/300178463)一. 析构函数的特征:析构函 ...