我的编程空间,编程开发者的网络收藏夹
学习永远不晚

深入剖析Android中Service和Thread区别

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

深入剖析Android中Service和Thread区别

Service既不是进程也不是线程,它们之间的关系如下:

可能有的朋友会问了,既然是长耗时的操作,那么Thread也可以完成啊。没错,在程序里面很多耗时工作我们也可以通过Thread来完成,那么还需要Service干嘛呢。接下来就为大家解释以下Service和Thread的区别。

首先要说明的是,进程是系统最小资源分配单位,而线程是则是最小的执行单位,线程需要的资源通过它所在的进程获取。

Service与Thread的区别:

Thread:Thread 是程序执行的最小单元,可以用 Thread 来执行一些异步的操作。

Service:Service 是android的一种机制,当它运行的时候如果是Local Service,那么对应的 Service 是运行在主进程的 main 线程上的。如果是Remote Service,那么对应的 Service 则是运行在独立进程的 main 线程上。

Thread 的运行是独立的,也就是说当一个 Activity 被 finish 之后,如果没有主动停止 Thread 或者 Thread 里的 run 方法没有执行完毕的话,Thread 也会一直执行。因此这里会出现一个问题:当 Activity 被 finish 之后,不再持有该 Thread 的引用,也就是不能再控制该Thread。另一方面,没有办法在不同的 Activity 中对同一 Thread 进行控制。
例如:如果 一个Thread 需要每隔一段时间连接服务器校验数据,该Thread需要在后台一直运行。这时候如果创建该Thread的Activity被结束了而该Thread没有停止,那么将没有办法再控制该Thread,除非kill掉该程序的进程。这时候如果创建并启动一个 Service ,在 Service 里面创建、运行并控制该 Thread,这样便解决了该问题(因为任何 Activity 都可以控制同一个Service,而系统也只会创建一个对应 Service 的实例)。
因此可以把 Service 想象成一种消息服务,可以在任何有 Context 的地方调用 Context.startService、Context.stopService、Context.bindService、Context.unbindService来控制它,也可以在 Service 里注册 BroadcastReceiver,通过发送 broadcast 来达到控制的目的,这些都是 Thread 做不到的。

不少Android初学者都可能会有这样的疑惑,Service和Thread到底有什么关系呢?什么时候应该用Service,什么时候又应该用Thread?答案可能会有点让你吃惊,因为Service和Thread之间没有任何关系!

之所以有不少人会把它们联系起来,主要就是因为Service的后台概念。Thread我们大家都知道,是用于开启一个子线程,在这里去执行一些耗时操作就不会阻塞主线程的运行。而Service我们最初理解的时候,总会觉得它是用来处理一些后台任务的,一些比较耗时的操作也可以放在这里运行,这就会让人产生混淆了。但是,如果我告诉你Service其实是运行在主线程里的,你还会觉得它和Thread有什么关系吗?让我们看一下这个残酷的事实吧。

在MainActivity的onCreate()方法里加入一行打印当前线程id的语句:


Log.d("MyService", "MainActivity thread id is " + Thread.currentThread().getId()); 

然后在MyService的onCreate()方法里也加入一行打印当前线程id的语句:


 Log.d("MyService", "MyService thread id is " + Thread.currentThread().getId()); 

现在重新运行一下程序,并点击Start Service按钮,会看到如下打印日志:

可以看到,它们的线程id完全是一样的,由此证实了Service确实是运行在主线程里的,也就是说如果你在Service里编写了非常耗时的代码,程序必定会出现ANR的

你可能会惊呼,这不是坑爹么!?那我要Service又有何用呢?其实大家不要把后台和子线程联系在一起就行了,这是两个完全不同的概念。Android的后台就是指,它的运行是完全不依赖UI的。即使Activity被销毁,或者程序被关闭,只要进程还在,Service就可以继续运行。比如说一些应用程序,始终需要与服务器之间始终保持着心跳连接,就可以使用Service来实现。你可能又会问,前面不是刚刚验证过Service是运行在主线程里的么?在这里一直执行着心跳连接,难道就不会阻塞主线程的运行吗?当然会,但是我们可以在Service中再创建一个子线程,然后在这里去处理耗时逻辑就没问题了。

额,既然在Service里也要创建一个子线程,那为什么不直接在Activity里创建呢?这是因为Activity很难对Thread进行控制,当Activity被销毁之后,就没有任何其它的办法可以再重新获取到之前创建的子线程的实例。而且在一个Activity中创建的子线程,另一个Activity无法对其进行操作。但是Service就不同了,所有的Activity都可以与Service进行关联,然后可以很方便地操作其中的方法,即使Activity被销毁了,之后只要重新与Service建立关联,就又能够获取到原有的Service中Binder的实例。因此,使用Service来处理后台任务,Activity就可以放心地finish,完全不需要担心无法对后台任务进行控制的情况。

以上就是小编为大家带来的深入剖析Android中Service和Thread区别的全部内容了,希望对大家有所帮助,多多支持编程网~

您可能感兴趣的文章:Andriod Service与Thread的区别介绍


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

深入剖析Android中Service和Thread区别

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

深入剖析Android中Service和Thread区别

Service既不是进程也不是线程,它们之间的关系如下:可能有的朋友会问了,既然是长耗时的操作,那么Thread也可以完成啊。没错,在程序里面很多耗时工作我们也可以通过Thread来完成,那么还需要Service干嘛呢。接下来就为大家解释以
2022-06-06

深入剖析Android系统中Service和IntentService的区别

Android中的Service是用于后台服务的,当应用程序被挂到后台的时候,问了保证应用某些组件仍然可以工作而引入了Service这个概念,那么这里面要强调的是Service不是独立的进程,也不是独立的线程,它是依赖于应用程序的主线程的,
2022-06-06

C语言和C++的区别:深入剖析

c++ 和 c++ 的主要区别在于语法、特性和用途。语法:c 使用花括号 { } 定义代码块,c++ 使用更灵活的面向对象语法。特性:c++ 引入了多态性、封装和继承,而 c 不支持这些特性。实战案例:c 侧重于计算,而 c++ 侧重于创建
C语言和C++的区别:深入剖析
2024-04-04

深入剖析Go语言中数组和切片的区别

本文将深入探讨Go语言数组和切片的区别,包括它们的定义、内存布局、长度和容量、初始化和操作等方面。从而更好地在实际开发中选择和使用合适的数据结构,提高代码的效率和可维护性,需要的可以参考一下
2023-05-19

深入浅析Android中DecorView与ViewRootImpl的区别

今天就跟大家聊聊有关深入浅析Android中DecorView与ViewRootImpl的区别,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。从setContentView说起一般地,
2023-05-31

Android中Handler、Thread和HandlerThread有什么区别

Handler是Android中用来处理消息和线程间通信的工具,主要用于将消息发送到消息队列,并在指定的时间处理这些消息。Handler通常与Looper和Message配合使用,可以在主线程中创建Handler,也可以在子线程中创建Han
Android中Handler、Thread和HandlerThread有什么区别
2024-03-01

PHP表格中的元素:深入剖析列与行的区别

表格元素中,列()包含按垂直排列的数据项,表示具体字段或属性;行()包含横向排列的列集合,表示数据记录或实体。使用php的dom操作,我们可以访问、添加、删除和修改表格中的元素,从而构建灵活而强大的网页布局。PHP表格中的元素:深入剖
PHP表格中的元素:深入剖析列与行的区别
2024-04-09

new和malloc的区别深入解析

以下是分别是对new和malloc的区别进行了详细的分析及介绍,需要的朋友可以过来参考下
2022-11-15

SpringBoot深入分析webmvc和webflux的区别

这篇文章主要介绍了SpringBoot深入分析webmvc和webflux的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
2023-02-02

深入分析@Resource和@Autowired注解区别

这篇文章主要为大家介绍了深入分析@Resource和@Autowired注解区别,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-05-16

怎么深度剖析JDK和JRE以及JVM三者的区别

本篇文章为大家展示了怎么深度剖析JDK和JRE以及JVM三者的区别,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。你对jdk,jre,jvm三者的区别和联系是否了解,这里和大家分享一下, j2sdk(
2023-06-17

深入解析Golang和Go的区别与共通

Golang 和 Go 的异同:一文读懂作为一种开源的编程语言,Go 于 2007 年由 Google 公司开发出来,被广泛用于构建高效、可靠、简洁的软件。Go 语言是基于 C 语言的编程语言,但它具有更加简洁的语法和更强大的并发支持。然
深入解析Golang和Go的区别与共通
2024-01-23

深入剖析Go语言在区块链开发中的优势和挑战

区块链技术作为一种新兴的分布式账本技术,正在逐渐成为各行各业的热门话题。其中,区块链开发领域也是备受关注的一个方面。在区块链开发中,选择合适的编程语言是至关重要的。本文将深入剖析Go语言在区块链开发中的优势和挑战,并结合具体的代码示例进行说
深入剖析Go语言在区块链开发中的优势和挑战
2024-03-11

深入剖析Android的Volley库中的图片加载功能

一、基本使用要点回顾 Volley框架在请求网络图片方面也做了很多工作,提供了好几种方法.本文介绍使用ImageLoader来进行网络图片的加载. ImageLoader的内部使用ImageRequest来实现,它的构造器可以传入一个Im
2022-06-06

深入浅析java中TCP与UDP的区别

深入浅析java中TCP与UDP的区别?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。TCP/UDP:TCP主要是面向连接的协议,它包含有建立和拆除连接,保证数据流的顺序和正
2023-05-31

Android中asset文件夹与raw文件夹的区别深入解析

*res/raw和assets的相同点:1.两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制。*res/raw和assets的不同点:1.res/raw中的文件会被映射到R.java文件中,访问的时候直接使用资源ID
2022-06-06

深入理解Python中range和xrange的区别

编程网已经给大家介绍过range和xrange的区别的基础知识,有兴趣的朋友可以参阅:python中xrange和range的区别 python中range()与xrange()用法分析 本次小编给大家带来的是深入理解range和xrang
2022-06-04

Android中WebChromeClient和WebViewClient的区别浅析

1、WebViewClient就是帮助WebView处理各种通知、请求事件的,具体来说包括:onLoadResource 、onPageStart 、onPageFinish 、onReceiveError 、onReceivedHttpA
2022-06-06

jQuery中filter()和find()的区别深入了解

一直不是很清楚filter()方法和find()方法的区别,看jQuery Cookbook一书后,终于算是搞清楚了,下面将新的与大家分享下
2022-11-15

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录