Android开发之旅:进程与线程

【经验】安全岗实习生应聘 在校大三狗应聘安全岗实习生的心路历程和所见所感,在无尽的吐槽过程中还有自己凭借着常年昏厥的大脑回忆的部分应聘过程,希望自己假装一次过来人给接下来的学弟学妹们提供点人生指导︿( ̄︶ ̄)︿故事纯属虚构,请勿对号入座。 阅读详情
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。 http://skynet.blog.51cto.com/1943397/365379
引言

当应用程序的组件第一次运行时,Android将启动一个只有一个执行线程的Linux进程。默认,应用程序所有的组件运行在这个进程和线程中。然而,你可以安排组件运行在其他进程中,且你可以为进程衍生出其它线程。本文从下面几点来介绍Android的进程与线程:

  1. 1、进程
  2. 2、线程
    1. 2.1、远程过程调用(Remote procedure calls,RPCs)
    2. 2.2、线程安全方法
1、进程

组件运行于哪个进程中由清单文件控制。组件元素——<activity>、<service>、<receiver>、<provider>,都有一个process属性可以指定组件运行在哪个进程中。这个属性可以设置为每个组件运行在自己的进程中,或者某些组件共享一个进程而其他的不共享。他们还可以设置为不同应用程序的组件运行在同一个进程中——假设这些应用程序共享同一个Linux用户ID且被分配了同样的权限。<application>元素也有process属性,为所有的组件设置一个默认值。

所有的组件都在特定进程的主线程中实例化,且系统调用组件是由主线程派遣。不会为每个实例创建单独的线程,因此,对应这些调用的方法——诸如View.onKeyDown()报告用用户的行为和生命周期通知,总是运行在进程的主线程中。这意味着,没有组件当被系统调用时应该执行很长时间或阻塞操作(如网络操作或循环计算),因为这将阻塞进程中的其它组件。你可以为长操作衍生独立的线程。

public boolean onKeyDown(int keyCode,KeyEvent event):默认实现KeyEvent.Callback.onKeyMultiple(),当按下视图的KEYCODE_DPAD_CENTER或KEYCODE_ENTER然后释放时执行,如果视图可用且可点击。

参数

keyCode-表示按钮被按下的键码,来自KeyEvent
event-定义了按钮动作的KeyEvent对象

返回值

如果你处理事件,返回true;如果你想下一个接收者处理事件,返回false。

当内存剩余较小且其它进程请求较大内存并需要立即分配,Android要回收某些进程,进程中的应用程序组件会被销毁。当他们再次运行时,会重新开始一个进程。

当决定终结哪个进程时,Android会权衡他们对用户重要性的相对权值。例如,与运行在屏幕可见的活动进程相比(前台进程),它更容易关闭一个进程,它的活动在屏幕是不可见(后台进程)。决定是否终结进程,取决于运行在进程中的组件状态。关于组件的状态,将在后面一篇——组件生命周期中介绍。

2、线程

虽然你可能会将你的应用程序限制在一个进程中,但有时候你会需要衍生一个线程做一些后台工作。因为用户界面必须很快地响应用户的操作,所以活动寄宿的线程不应该做一些耗时的操作如网络下载。任何不可能在短时间完成的操作应该分配到别的线程。

线程在代码中是用标准的Java线程对象创建的,Android提供了一些方便的类来管理线程——Looper用于在线程中运行消息循环、Handler用户处理消息、HandlerThread用户设置一个消息循环的线程。

Looper类

该类用户在线程中运行消息循环。线程默认没有消息循环,可以在线程中调用prepare()创建一个运行循环;然后调用loop()处理消息直到循环结束。大部分消息循环交互是通过Handler类。下面是一个典型的执行一个Looper线程的例子,分别使用prepare()和loop()创建一个初始的Handler与Looper交互: 
 

   
  1. class LooperThread extends Thread {   
  2.       public Handler mHandler;   
  3.         
  4.       public void run() {   
  5.           Looper.prepare();   
  6.             
  7.           mHandler = new Handler() {   
  8.               public void handleMessage(Message msg) {   
  9.                   // process incoming messages here   
  10.               }   
  11.           };   
  12.             
  13.           Looper.loop();   
  14.       }   
  15.  }  

 

更多的关于Looper的信息及Handler、HandlerThread请参阅相关资料。

2.1、远程过程调用(Remote procedure calls,RPCs)

Android有一个轻量级的远程过程调用机制——方法在本地调用却在远程(另外一个进程中)执行,结果返回给调用者。这需要将方法调用和它伴随的数据分解为操作系统能够理解的层次,从本地进程和地址空间传输到远程进程和地址空间,并重新组装调用。返回值以相反方向传输。Android提供了做这些工作的所有代码,这样我们可以专注于定义和执行RPC接口本身。

一个RPC接口仅包含方法。所有的方法同步地执行(本地方法阻塞直到远程方法执行完成),即使是没有返回值。简言之,该机制工作原理如下:首先,你用简单的IDL(interface definition language,接口定义语言)声明一个你想实现的RPC接口。从这个声明中,aidl工具生成一个Java接口定义,提供给本地和远程进程。它包含两个内部类,如下图所示:

Android开发之旅:进程与线程

内部类有管理你用IDL定义的接口的远程过程调用所需要的所有代码。这两个内部类都实现了IBinder接口。其中之一就是在本地由系统内部使用,你写代码可以忽略它。另外一个是Stub,扩展自Binder类。除了用于有效地IPC(interprocess communication)调用的内部代码,内部类在RPC接口声明中还包含方法声明。你可以定义Stub的子类实现这些方法,如图中所示。

通常情况下,远程过程有一个服务管理(因为服务能通知系统关于进程和它连接的其它进程的信息)。它有由aidl工具生成的接口文件和Stub子类实现的RPC方法。服务的客户端仅有由aidl工具生成的接口文件。

下面介绍服务如何与它的客户端建立连接:

  • 服务的客户端(在本地端的)应该实现onServiceConnected() 和onServiceDisconnected() 方法,因此当与远程服务建立连接成功和断开连接是会通知它。然后调用bindService() 建立连接。
  • 服务的onBind()方法将实现为接受或拒绝连接,者取决于它接受到的意图(该意图传送到binServive())。如果连接被接受,它返回一个Stub子类的实例。
  • 如果服务接受连接,Android调用客户端的onServiceConnected()方法且传递给它一个IBinder对象,返回由服务管理的Stub子类的一个代理。通过代理,客户端可以调用远程服务。

这里只是简单地描述,省略了一些RPC机制的细节。你可以查阅相关资料或继续关注Android开发之旅,后面将为你奉上。

2.2、线程安全方法

在一些情况下,你实现的方法可能会被不止一个线程调用,因此必须写成线程安全的。这对远程调用方法是正确的——如上一节讨论的RPC机制。当从IBinder进程中调用一个IBinder对象中实现的一个方法,这个方法在调用者的线程中执行。然而,当从别的进程中调用,方法将在Android维护的IBinder进程中的线程池中选择一个执行,它不在进程的主线程中执行。例如,一个服务的onBind()方法在服务进程的主线程中被调用,在onBind()返回的对象中执行的方法(例如,实现RPC方法的Stub子类)将在线程池中被调用。由于服务可以有一个以上的客户端,所以同时可以有一个以上的线程在执行同一个IBinder方法。因此,IBinder的方法必须是线程安全的。

同样,一个内容提供者可以接受其它进程产生的数据请求。虽然ContentResolver 和 ContentProvider 类隐藏进程通信如何管理的,对应哪些请求的ContentResolver 方法——query()、insert()、delete()、update()、getType(),在内容提供者的进程的线程池中被调用,而不是在这一进程的主线程中。因为这些方法可以同时从任意数量的线程中调用,他们也必须实现为线程安全的。

本系列的其它文章:

  1. Android 开发之旅:环境搭建及HelloWorld
  2. Android 开发之旅:HelloWorld项目的目录结构
  3. Android 开发之旅:android架构
  4. Android 开发之旅:应用程序基础及组件
  5. Android 开发之旅:应用程序基础及组件(续)
  6. Android 开发之旅:活动与任务
  7. 从android架构到这篇基本内容都是意译自Android SDK文档。

本文出自 “吴秦(Saylor)” 博客,请务必保留此出处http://skynet.blog.51cto.com/1943397/365379

最新教程:Python开发钉钉群自定义机器人 最近疫情比较严重,很多公司依靠阿里旗下的办公软件钉钉来进行远程办公,当然了,钉钉这个产品真的是让人一言难尽,要多难用有多难用,真的让人觉得阿里的pm都是脑残才会设计出这种脑残产品,不过吐槽归吐槽,该用还得用, 虽然钉钉别的功能很鸡肋,但是机器人这个功能还是让人眼前一亮,属于比较极客的功能,它可以将第三方服务的信息聚合到钉钉群中,实现信息的自动化同步,例如:通过聚合Github、Gitlab等... 阅读详情

相关推荐

内网AI开发实战:从零搭建企业知识库与私有化大模型

随着企业数据安全要求日益严格,将AI能力落地到内网环境成为刚需。私有化部署大模型是实现数据不出内网的核心手段,而RAG(检索增强生成)架构则让企业知识库无需微调即可获得精准回答。通过Dify、Ollama等工具,普通开发团队也能快速搭建本地化AI服务。本文从数据隔离原理出发,介绍内网AI环境搭建的硬件选型、离线部署、模型加载与知识库配置,并给出常见问题排查经验,帮助企业以低门槛的方式构建安全可控的智能问答系统。

weixin_33795743的博客 608

android应用内将指定进程绑CPU小核

在Android平台上,为了实现对特定进程进行精细化的资源管理,有时候开发者希望将应用中的某个进程绑定到CPU的小核心上运行,以达到节能或者满足特定性能需求的目的。由于Android操作系统基于Linux内核,它提供了底层机制来允许进程或线程与特定CPU核心进行绑定。以下是如何在Android应用中实现这一功能的详细步骤和技术说明。

Programming Talk 1606

科大讯飞SR502星火版:AI语音转写与实时摘要的生产力革命

语音转写是智能办公的基础能力,其核心在于从原始音频中提取可编辑、可检索的结构化文本。这依赖于ASR自动语音识别、NLP自然语言处理及上下文语义理解等关键技术。随着大模型技术成熟,语音处理正从‘听清’迈向‘听懂’——不仅能准确识别普通话与方言,更能理解对话意图、提取待办事项、生成会议摘要。科大讯飞SR502星火版正是这一演进的典型代表,它深度融合星火认知大模型与本地语音DSP芯片,在真实会议、课堂、访谈等多噪场景下实现高准确率转写与实时流式分析,显著提升信息处理效率。本文聚焦其语音识别引擎升级、场景自适应逻辑

areen7003的博客 343

LangChain实现带记忆的本地文档问答系统

文档问答(Document QA)是企业知识管理的核心技术,其本质是将非结构化文本转化为可交互语义服务。传统RAG依赖单轮检索与生成,缺乏对话状态维护能力,导致指代消解失败、上下文断裂和安全失控。LangChain通过Memory模块(如ConversationSummaryMemory)与ConversationalRetrievalChain深度集成,支持历史摘要压缩、检索结果动态加权与协同提示工程,显著提升多轮问答准确率与响应稳定性。结合本地化LLM部署、Chroma向量库调优及PDF智能分块等工程实

weixin_34055787的博客 513

开源ChatGPT桌面神器:跨平台支持Mac/Win/Linux,Github 52.7K Stars的轻量替代方案

本文介绍了一款在Github上获得52.7K Stars的开源ChatGPT桌面客户端。它完美解决了官方客户端的系统限制,为Mac、Windows和Linux用户提供了一个轻量、快速且功能强大的跨平台替代方案。文章详细阐述了其核心优势、安装配置指南及进阶使用技巧,帮助用户无缝集成AI助手以提升工作效率。

defi6farmer的博客 839

AI辅助编程工具技术评估(2025年):CodeBuddy在开发者生态中的差异化优势分析

基于2025年行业数据,全球AI辅助编程工具市场增速超30%,中国开发者渗透率达35%。腾讯云CodeBuddy凭借​​双模型架构(腾讯混元+DeepSeek)​​、​​MCP协议生态​​及​​企业级安全设计​​,在性能、可靠性、成本维度形成差异化优势。本文通过量化指标与横向对比,解析CodeBuddy的技术竞争力与适用场景。

wenghongzhang的博客 3231

android 中线程与线程,进程与进程之间如何通信,线程与线程,进程与进程之间的通信...

线程与线程之间的通信一,为什么要线程通信?1>多个线程并发执行时, 在默认情况下CPU是随机切换线程的,当我们需要多个线程来共同完成一件任务, 并且我们希望他们有规律的执行, 那么多线程之间需要一些协调通信,以此来帮我们达到多线程共同操作一份数据。2>当然如果我们没有使用线程通信来进行多线程共同操作同一份数据的话,虽然可以实现,但是在很大程度会造成多线程之间对同一共享变量的争夺,那样的...

weixin_36166988的博客 394

分享71个PHP源代码总有一个是你想要的 分享71个PHP源代码,总有一款适合你

链接:https://pan.baidu.com/s/1SIjh2tMh7JKTBrOVu4Ms0Q 提取码:39y4 收集整理不容易老铁支持我动力。 下面是文件的名字,我放了一些图片,文章里不是所有的图主要是放不下...,大家下载后可以看到。 Niushop开源商城Saas多开运营版 v4 CmsEasy 可视化编辑商城系统 v7.6.5 魔众大转盘抽奖系统 v2.0.0 DSO2O外卖订餐开源系统源码 v4.0.1 网钛CMS PHP版(内置小刀模板) v5.32 QCMS企业建站系统 v5.0

猎人村庄的博客 7001

android 线程辅助处理类(用于在主线程和其他线程中执行逻辑)

  // 1、在主线程执行逻辑—— 一般为涉及UI界面控件的处理逻辑 ThreadTool.RunInMainThread(new ThreadPram() { @Override public void Function() { // TODO Auto-generated method stub // 在主线程执行逻辑 } }); // 2、在新的线程中执行逻...

暂无内容 724

利用Python编程简单开发钉钉群机器人

很多公司依靠阿里旗下的办公软件钉钉来进行远程办公,当然了,钉钉这个产品真的是让人一言难尽,要多难用有多难用,真的让人觉得阿里的pm都是才会设产品,不过吐槽归吐槽,该用还得用。 虽然钉钉别的功能很鸡肋,但是机器人这个功能还是让人眼前一亮,属于比较极客的功能,它可以将第三方服务的信息聚合到钉钉群中,实现信息的自动化同步。 例如:通过聚合Github、Gitlab等源码管理服务,实现源码更新同步;通过聚合Trello、JIRA等项目协调服务,实现项目信息同步;同时,支持Webhook协议的自定义接入,..

python588的博客 698

国产大模型实战避坑指南:豆包、Kimi、文心一言、通义千问工作流适配手册

大语言模型(LLM)已从技术概念进入日常办公核心环节,其本质是基于Transformer架构的序列预测系统,通过海量文本学习语义模式与知识关联。当前主流国产大模型虽参数规模接近,但底层设计哲学差异显著:豆包侧重场景感知与多模态轻推理,Kimi聚焦长文本结构化索引,文心一言依赖搜索增强的事实蒸馏,通义千问强调企业级RAG可控性与错误溯源。这种差异直接决定其在PPT写作、合同解析、OCR识别、政策问答、API集成等高频工程场景中的稳定性与适配度。本文基于27个真实工作流、37轮重复验证及四款模型(AI大模型、人

chuanggangbo5551的博客 540

Android基础学习之进程间和线程间通信方式总结

        首先介绍一下进程和线程的基本概念及两者之间的区别:   进程:是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。   线程:是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。线程自己基本上不拥有系统资源,只拥有一些在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其...

Alexlee1986的专栏 4671

大模型音频能力实战:NotebookLM与ChatGPT语音交互深度解析

大语言模型(LLM)的音频能力正从基础TTS语音合成,跃升为融合语音识别(ASR)、语义理解、上下文推理与情感化语音合成(TTS)的全链路智能交互范式。其核心原理在于构建‘语音输入→语义图谱→结构化推理→韵律可控语音输出’的双向闭环,显著提升知识消化效率与对话自然度。技术价值体现在降低信息处理认知负荷、支持实时多轮追问、强化专业领域适配,并在用户访谈分析、会议纪要提炼、教育反馈处理等场景中实现端到端语音驱动工作流。本文聚焦NotebookLM与ChatGPT Advanced Voice两大代表性工具,深入

weixin_30345577的博客 610

DeepSeek V4深度评测:国产大模型如何适配中文工作流

大语言模型(LLM)作为人工智能的核心基础设施,其能力本质取决于架构设计、语料质量与工程落地的协同。DeepSeek V4并非单纯追求参数规模,而是通过MLA注意力机制优化计算效率,结合MoE专家路由提升任务适配精度,并依托高质量中文语料工程实现对本土语境、职场表达与政务技术场景的深度建模。这种‘有效参数密度’导向的技术路径,显著降低了长文本推理延迟与显存开销,使本地化部署在中小企业级GPU硬件上具备可行性。在文案生成、技术文档理解、代码辅助与知识问答等高频企业应用场景中,V4展现出优于通用模型的语义对齐能

weixin_34208283的博客 450

CentOS内网环境下的MaxKB企业级部署实战

本文详细讲解了在无外网的CentOS内网环境中,如何完成MaxKB的企业级离线部署。内容涵盖从离线资源准备、服务器环境预检,到分步安装配置、故障排查及后期调优的全流程实战指南,旨在帮助企业IT人员高效、稳定地搭建私有AI知识库系统。

weixin_29201933的博客 218

AI面试系统技术解析与招聘效率提升实践

人工智能技术在招聘领域的应用正逐步改变传统人力资源管理模式。AI面试系统通过自然语言处理、计算机视觉等核心技术,实现了简历智能解析、多模态行为评估等关键功能。其技术价值在于突破人工筛选的效率瓶颈,将初筛耗时从数周缩短至数天。典型应用场景包括校园招聘季的简历海啸处理、跨区域面试的方言识别等。以某快消企业为例,系统使初筛效率提升82%,同时降低76%的人均成本。系统采用BERT+BiLSTM混合模型处理非结构化数据,并创新性地设计压力测试问题链来识别真实能力,这些技术方案有效解决了候选人刻意表演和跨文化评估偏差

weixin_33994429的博客 504

别再套模板了!用这个实战案例教你写一份能落地的需求规格说明书

本文通过实战案例详细解析如何撰写一份开发团队真正需要的需求规格说明书,避免套用模板的常见误区。文章重点介绍了需求文档的核心价值、功能描述的黄金法则、非功能需求的关键细节以及验收标准的编写技巧,帮助产品经理提升文档质量,确保开发团队准确理解需求。

weixin_34233974的博客 317

MuJoCo与Isaac Sim的无缝对接:利用USD导出功能实现强化学习场景的跨平台迁移

本文详细介绍了如何通过USD导出功能实现MuJoCo与Isaac Sim的无缝对接,助力强化学习场景的跨平台迁移。文章解析了USD格式的核心优势,包括分层合成、物理属性继承和时间轴动画,并提供了从MJCF到USD的完整转换流程及在Isaac Sim中的高级应用技巧,帮助开发者高效迁移和优化强化学习环境。

weixin_29073241的博客 517
上一篇: Android开发之旅:活动与任务
下一篇: Android开发之旅:组件生命周期
xing...
博客等级 码龄17年 30粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值