掌握Android中的进程和线程

进程和线程是现代网络操作系统的核心概念。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()方法来相应这些请求,而这些方法也都是由那个内容提供者的进程中所包涵的线程池提供的,而不是进程的主线程本身。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/548404.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高温津贴:关键是消除劳动者“权利贫困”

每年6月至10月期间&#xff0c;劳动者从事露天岗位工作以及用人单位不能采取有效措施将作业场所温度降低到33℃以下的&#xff0c; 用人单位应当按月向劳动者发放高温津贴&#xff0c;违反者处 2000 元以上 10000 元以下罚款。 据报道&#xff0c;目前广州一些建筑工地、搬家公…

Log4j.properties的简单配置

一、首先导入jar包&#xff1a;log4j-1.2.17.jar 二、新增log4j.properties配置文件并输入以下内容&#xff1a; 三、在测试代码总中进行测试&#xff1a; Service public class CKKuCunServiceImpl implements CKKuCunService{Autowiredpublic CKKuCunMapper ckKuCunMapper;…

oracle中保留2位小数的写法

select to_char(1.5678,99.99) from dual 输出&#xff1a;1.57 select to_char(1.5,00.00) from dual 输出&#xff1a;01.50

C#中事务的简单使用

在C#中开启事务的步骤 一、调用SqlConnection对象的BeginTransaction()方法&#xff0c;创建一个SqlTransaction对象&#xff0c;标志事务开始。 二、将创建的SqlTransaction对象分配给要执行的SqlCommand的Transaction属性。 三、调用相应的方法执行SqlCommand命令。 四、调…

建立openstack quantum开发环境 .

建立openstack quantum开发环境 作者&#xff1a;张华 发表于&#xff1a;2012-4-6 版权声明&#xff1a;可以任意转载&#xff0c;转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明 ( http://blog.csdn.net/quqi99 ) 上篇中讲了如何建立openstack的最小开发环…

使用Jquery插件bTabs实现多页签打开效果

官网地址&#xff1a;点击这里进入官网 资源导入 <link rel"stylesheet" href"b.tabs.css" type"text/css"> <!-- 插件核心脚本 --> <script type"text/javascript" src"b.tabs.js" ></script> &l…

体验Office 2013预览版

微软目前刚发布新版本的office2013,暂时没有中文版。Windows 8下搭配64位office 2013效果非常不错&#xff0c;具体浏览下方的视频。 X86&#xff08;32位&#xff09; 英文版&#xff1a;http://care.dlservice.microsoft.com/download/4/7/1/4712B4E1-4DD9-4468-B8A4-507D7F9…

iframe父页面与子页面之间的元素获取与方法调用

JS 父页面调用子页面子页面调用父页面元素window.frames[iframe的name属性值];① window.parent.document.getElementById("父页面元素ID"); ②window.parent.document.getElementsByTagName("父页面元素标签名")[i]; ③window.parent.document.getElement…

网络营销第四课:网络营销需要掌握的网页代码(2)

1、<hr>水平线标记&#xff1a;<HTML> <HEAD> <TITLE>HR的用法</TITLE> </HEAD> <BODY> <H3>插画中国论坛:漫画 卡通 吉祥物 游戏 海报(原创) </H3> <HR size 15 align left width 80%> <HR color"…

PDA手持终端WinCE系统连接SqlServer数据库

引言&#xff1a;因项目需求需要通过使用PDA手持终端对条码进行数据采集&#xff0c;并将数据传输到SqlServer进行增删改查操作&#xff0c;一般来说&#xff0c;跟sqlserver的版本没有特别大的关系&#xff0c;我见过用05的、08的、我自己用的2014版本。PDA用的是基恩士的&…

一些算法题,欢迎来改进

第一题&#xff0c;关键字&#xff1a;字符串翻转 Reverse the words in a given English sentence (string) in C or C without requiring a separate buffer to hold the reversed string (programming) For example: Input: REALLY DOGSDISLIKE MONKEYSOutput: MONKEYS DIS…

堆和栈、值类型与引用类型、装箱与拆箱

堆栈&#xff1a;内存条里的某一块。 电脑中有6个地方可以保存数据。 <1>寄存器&#xff1a;保存最快。这东西在处理器内部。也就是CPU里的一小块地方给你放数据。既然是CPU&#xff0c;那么主要工作是计算&#xff0c;所以这块寄存器能放的东西十分有限&#xff0c;寄存…

ASP.NET MVC 上传图片到项目目录中的文件夹并显示

因项目需求&#xff0c;需要一个上传图片并显示的功能&#xff0c;类似于上传头像并显示出来。查阅了网上资料&#xff0c;写了个Demo&#xff0c;希望能帮助到更多的人。此Demo基于ASP.NET MVC实现。 选择图片&#xff1a; 点击按钮进行上传&#xff1a; 一、先在项目中新建一…

java查询SQLServer遇到问题:对象名无效。

症状阐述:在与数据库连接成功后,使用sql语言时,出现找不到"表"对象. 原因:一般为所使用账户对数据库中的表,没有读取权限 结局办法:1、进入对象资源管理器&#xff0c;找到“安全性”-->"登录名"-->"你登陆数据库使用的账户" 2、双击找到…

sql server 按照日期自动生成单据编号的函数

一、sql server 按照日期自动生成单据编号的函数&#xff0c;格式为##08080001&#xff0c;##表示打头的单据字符&#xff0c;然后是年月和流水编号。二、传入的参数为单据的打头字符和生成单据的日期三、一般的调用格式为dbo.GetCostBillID(HP,getdate()) --按单号和年月获取单…

关于linux下制作静态库

本小测试程序是从<<linux程序设计第4版>>摘录&#xff1b; 直接入正正题&#xff1a; 我们要创建一个表态库&#xff0c;libfoo.a 所用文件: fred.c bill.c 其中fred.c代码如下&#xff1a; #include <stdio.h> void fred(int arg) { printf("f…

JQuery Datatables 实现对某一列的数据合计汇总

有两种实现方式&#xff0c;举例说明 第一种、JS代码如下&#xff1a; var table;table $(#example).DataTable({dom: Bfrtip,scrollY: true,scrollX: true,scrollCollapse: true,colReorder: true,select: true,stateSave: true,//info: false,//关闭左下角关于行数和选中的…

puppet语法学习

先讲讲shell 与puppet的不同。shell 脚本是过程式的&#xff0c;里面描述的是命令执行的过程&#xff0c;shell 通常很短&#xff0c;可以很快写出来&#xff0c;但是很快又会被抛弃&#xff0c;它常常依赖于特定操作系统环境。puppet 语言是结果式的&#xff0c;使用者将自己想…

JQuery DataTables改变行或列的背景或字体颜色

var table;table $(#example).DataTable({dom: Bfrtip,scrollY: true,scrollX: true,scrollCollapse: true,colReorder: true,select: true,stateSave: true,//info: false,//关闭左下角关于行数和选中的提示//filter: false,//关闭搜索//paging: false,//关闭分页pagingType:…