返回顶部
首页 > 资讯 > 移动开发 >掌握Android中的进程和线程
  • 383
分享到

掌握Android中的进程和线程

进程线程Android 2022-06-06 12:06:42 383人浏览 薄情痞子
摘要

  进程和线程是现代网络操作系统的核心概念。Android作为一种的、承袭linux的移动操作系统,其进程和线程的概念是开发者和安全工作人员需要深入了解的问题。本文将详细介

  进程和线程是现代网络操作系统的核心概念。Android作为一种的、承袭linux的移动操作系统,其进程和线程的概念是开发者和安全工作人员需要深入了解的问题。本文将详细介绍Android中的进程、线程以及相关的技术问题。

  进程和线程的基本概念

  当一个应用程序开始运行它的第一个组件时,Android会为它启动一个Linux进程,并在其中执行一个单一的线程。默认情况下,应用程序所有的组件均在这个进程的这个线程中运行。然而,你也可以安排组件在其他进程中运行,而且可以为任意进程衍生出其它线程。

  Android中的进程

  组件运行所在的进程由manifest文件所控制。组件元素——<activity>, <service>, <receiver>和<provider>——都有一个 process 属性来指定组件应当运行于哪个进程之内。这些属性可以设置为使每个组件运行于它自己的进程之内,或一些组件共享一个进程而其余的组件不这么做。它们也可以设置为令不同应用程序的组件在一个进程中运行——使应用程序的组成部分共享同一个Linux用户ID并赋以同样的权限。<application>元素也有一个process属性,以设定所有组件的默认值。

  所有的组件实例都位于特定进程的主线程内,而对这些组件的系统调用也将由那个线程进行分发。一般不会为每个实例创建线程。因此,某些方法总是运行在进程的主线程内,这些方法包括诸如View.onKeyDown()这样报告用户动作以及生命周期通告的。这意味着组件在被系统调用的时候,不应该施行长时间的抑或阻塞的操作(诸如网络相关操作或是循环计算),因为这将阻塞同样位于这个进程的其它组件的运行。你应该如同下面线程部分所叙述的那样,为这些长时间操作衍生出一个单独的线程进行处理。

  在可用内存不足而又有一个正在为用户进行服务的进程需要更多内存的时候,Android有时候可能会关闭一个进程。而在这个进程中运行着的应用程序也因此被销毁。当再次出现需要它们进行处理的工作的时候,会为这些组件重新创建进程。

  在决定结束哪个进程的时候,Android会衡量它们对于用户的相对重要性。比如说,相对于一个仍有用户可见的activity的进程,它更有可能去关闭一个其activity已经不为用户所见的进程。也可以说,决定是否关闭一个进程主要依据在那个进程中运行的组件的状态。

  Android中的线程

  尽管你可以把你的应用程序限制于一个单独的进程中,有时,你仍然需要衍生出一个线程以处理后台任务。因为用户界面必须非常及时的对用户操作做出响应,所以,控管activity的线程不应用于处理一些诸如网络下载之类的耗时操作。所有不能在瞬间完成的任务都应安排到不同的线程中去。

  线程在代码中是以标准JavaThread对象创建的。Android提供了很多便于管理线程的类:Looper用于在一个线程中运行一个消息循环,Handler用于处理消息,HandlerThread 用于使用一个消息循环启用一个线程。

  rpc:远程过程调用

  Android有一个轻量级的远程过程调用(RPC)机制:即在本地调用一个方法,但在远程(其它的进程中)进行处理,然后将结果返回调用者。这将方法调用及其附属的数据以系统可以理解的方式进行分离,并将其从本地进程和本地地址空间传送至远程过程和远程地址空间,并在那里重新装配并对调用做出反应。返回的结果将以相反的方向进行传递。Android提供了完成这些工作所需的所有的代码,以使你可以集中精力来实现RPC接口本身。

  RPC接口可以只包括方法。即便没有返回值,所有方法仍以同步的方式执行(本地方法阻塞直至远程方法结束)。

  简单的说,这套机制是这样工作的:一开始,你用简单的IDL(界面描绘语言)声明一个你想要实现的RPC接口。然后用aidl 工具为这个声明生成一个Java接口定义,这个定义必须对本地和远程进程都可见。它包含两个内部类。内部类中有管理实现了你用IDL声明的接口的远程方法调用所需要的所有代码。两个内部类均实现了IBinder接口。一个用于系统在本地内部使用,你些的代码可以忽略它;另外一个,我们称为Stub,扩展了Binder类。除了实现了IPC调用的内部代码之外,它还包括了你声明的RPC接口中的方法的声明。一般情况下,远程过程是被一个服务所管理的(因为服务可以通知系统关于进程以及它连接到别的进程的信息)。它包含着aidl工具产生的接口文件和实现了RPC方法的Stub的子类。而客户端只需要包括aidl工具产生的接口文件。

  下面将说明服务与其客户端之间的连接是如何建立的,更为详细的有关RPC机制的讨论和知识,读者可以参见坦尼保姆所著的《分布式系统》一书,里面有非常详细和精彩的论述:

  1)服务的客户端(位于本地)应该实现onServiceConnected() 和onServiceDisconnected() 方法。这样,当至远程服务的连接成功建立或者断开的时候,它们会收到通知。这样它们可以调用bindService() 来设置连接。

  2)而服务则应该实现onBind() 方法以接受或拒绝连接。这取决于它收到的intent(intent将传递给bindService())。如果接受了连接,它会返回一个Stub的子类的实例。

  3)如果服务接受了连接,Android将会调用客户端的onServiceConnected()方法,并传递给它一个IBinder对象,它是由服务所管理的Stub的子类的代理。通过这个代理,客户端可以对远程服务进行调用。

  掌握线程安全方法

  在一些情况下,你所实现的方法有可能会被多于一个的线程所调用,所以它们必须被写成线程安全的。

  对于我们上面所讨论的RPC机制中的可以被远程调用的方法来说,这是必须首先考虑的。如果针对一个IBinder对象中实现的方法的调用源自这个IBinder对象所在的进程时,这个方法将会在调用者的线程中执行。然而,如果这个调用源自其它的进程,则这个方法将会在一个线程池中选出的线程中运行,这个线程池由Android加以管理,并与IBinder存在于同一进程内;这个方法不会在进程的主线程内执行。反过来说,一个服务的onBind() 方法应为服务进程的主线程所调用,而实现了由onBind() 返回的对象(比如说,一个实现了RPC方法的Stub的子类)的方法将为池中的线程所调用。因为服务可以拥有多于一个的客户端,而同一时间,也会有多个池中的线程调用同一个IBinder方法。因此IBinder方法必须实现为线程安全的。

  类似的,一个内容提供者能接受源自其它进程的请求数据。尽管ContentResolver和ContentProvider类隐藏了交互沟通过程的管理细节,ContentProvider会由query(),insert(),delete(),update()和getType()方法来相应这些请求,而这些方法也都是由那个内容提供者的进程中所包涵的线程池提供的,而不是进程的主线程本身。


--结束END--

本文标题: 掌握Android中的进程和线程

本文链接: https://lsjlt.com/news/28815.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 掌握Android中的进程和线程
      进程和线程是现代网络操作系统的核心概念。Android作为一种的、承袭Linux的移动操作系统,其进程和线程的概念是开发者和安全工作人员需要深入了解的问题。本文将详细介...
    99+
    2022-06-06
    进程 线程 Android
  • 掌握 Python 并发编程:揭秘协程、线程和进程
    并发编程是编写同时执行多个任务的代码的艺术,在 Python 中提供了协程、线程和进程等多种选项。了解这些选项及其适用场景对于开发高效、可扩展的应用程序至关重要。 协程 协程是 Python 中一种轻量级的并发机制,允许一个函数暂停执行...
    99+
    2024-02-18
    协程 线程 进程 并发 Python
  • 一文带你掌握Python中多线程和线程池的使用方法
    目录一、多线程二、线程池三、使用案例Python是一种高级编程语言,它在众多编程语言中,拥有极高的人气和使用率。Python中的多线程和线程池是其强大的功能之一,可以让我们更加高效地...
    99+
    2023-05-16
    Python多线程 线程池使用 Python多线程 Python 线程池
  • Android 进程和线程模型
      Android进程模型   在安装Android应用程序的时候,Android会为每个程序分配一个Linux用户ID,并设置相应的权限,这样其它应用程序不能访问此应...
    99+
    2022-06-06
    进程 模型 线程 Android
  • Android 进程和线程详解
      当启动一个应用程序组件时,如果该应用没有正在运行的其它程序组件,那么Android系统将为这个应用创建一个新进程(包含一个线程)用于运行应用。缺省情况下,一个应用的所有...
    99+
    2022-06-06
    进程 线程 Android
  • 详解Android进程和线程
    写在前面的话 一个Android应用就是一个Linux进程,每个应用在各自的进程中运行,互不干扰,比较安全。 一个应用对应一个主线程,就是通常所说的UI线程,android遵守...
    99+
    2022-06-06
    线程 Android
  • Java并发和线程安全怎么掌握
    本文小编为大家详细介绍“Java并发和线程安全怎么掌握”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java并发和线程安全怎么掌握”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。为什么有多线程谈到多线程,我们很容...
    99+
    2023-06-02
  • Java 多线程之两步掌握
    目录导论:初识多线程一:动手来创建多线程1.1 创建一个主线程1.2 多线程抢占式执行二:创建线程的几个常用方法2.2 继承 Thread 类2.2 实现 Runnable 接口2....
    99+
    2024-04-02
  • 【Java】你掌握了多线程吗?
    【文末送书】今天推荐一本Java多线程编程领域新书《一本书讲透Java线程》 摘要 互联网的每一个角落,无论是大型电商平台的秒杀活动,社交平台的实时消息推送,还是在线视频平台的流量洪峰,背后都离不开多线程技术的支持。在数字化转型的过程中...
    99+
    2023-12-22
    java 开发语言 线程
  • android进程和线程的区别有哪些
    Android进程和线程的区别如下:1. 进程是操作系统进行资源分配和管理的最小单位,而线程是进程中的执行单位。一个进程可以包含多个...
    99+
    2023-09-14
    android
  • 怎么理解并掌握Python线程
    这篇文章主要讲解了“怎么理解并掌握Python线程”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么理解并掌握Python线程”吧!1.自定义进程自定义进程类,继承Process类,重写ru...
    99+
    2023-06-25
  • 分析Android中线程和线程池
    目录前言HandlerThreadIntentService线程池的好处ThreadPoolExecutor线程池的分类FixedThreadPoolCachedThreadPool...
    99+
    2024-04-02
  • android进程和线程有什么区别
    Android进程和线程是两个概念,它们有以下区别:1. 定义:进程是程序的执行实例,是操作系统对程序的一种抽象;线程是进程中的一个...
    99+
    2023-09-23
    android
  • 线程池的艺术:掌握并发编程的关键
    线程池的好处 减少开销: 通过复用线程,线程池可以消除与每次创建和销毁线程相关的高开销。 提高性能: 预先创建并准备好线程可以显著提高应用程序的响应时间,特别是对于突发流量。 控制并行性: 线程池允许开发者限制同时运行的线程数量,从而防...
    99+
    2024-03-13
    线程池
  • 详解Python中的进程和线程
    进程是什么? 进程就是一个程序在一个数据集上的一次动态执行过程。进程一般由程序、数据集、进程控制块三部分组成。我们编写的程序用来描述进程要完成哪些功能以及如何完成;数据集则是程序在执...
    99+
    2024-04-02
  • JS中的进程和线程详解
    进程和线程都是计算机中的概念,用于描述程序执行时的运行单位。 进程是指正在运行的程序的实例,包括程序代码、数据、堆栈和资源等。 每个进程都拥有独立的地址空间,因此不同进程之间的数据无...
    99+
    2023-05-17
    JS的进程和线程 JS中的进程 JS中的线程
  • python3进程和线程
    进程基本概念 进程是执行中的程序, 也就是说进程是动态的, 程序是静态的 进程是操作系统分配资源的最小单位,有一个进程控制块(PCB), 有自己唯一的一个进程标识符(PID) 进程之间相互独立, 内存不共享 每个进程都是一个实体, ...
    99+
    2023-01-31
    线程 进程
  • Java多线程程序如何掌握基本语法
    本篇文章为大家展示了Java多线程程序如何掌握基本语法,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Java多线程程序需要我们具体的学习相关语法。其中我们要了解相关的语法究竟有什么。很多重要的问题成...
    99+
    2023-06-17
  • Node.js中的进程和线程是什么
    这篇文章主要介绍“Node.js中的进程和线程是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Node.js中的进程和线程是什么”文章能帮助大家解决问题。一、进...
    99+
    2024-04-02
  • Android中的线程和线程池有什么作用
    今天小编给大家分享一下Android中的线程和线程池有什么作用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。前言从用途上来说...
    99+
    2023-07-04
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作