Android中的ActivityThread和ApplicationThread

article/2025/11/5 6:08:49

一:ActivityThread和ApplicationThread
1.ActivityThread:主线程、UI线程,程序的入口(main函数),不是线程是运行在主线程中的一个对象
主要的成员变量如下:
在这里插入图片描述

mActivities、mServices和mProviderMap 这三个变量保存了应用中所有的对应组件(相对生命周期长的,BroadcastReceiver生命周期很短暂);

main方法中:

       public static void More ...main(String[] args) {
5220        SamplingProfilerIntegration.start();
5221
5222        // CloseGuard defaults to true and can be quite spammy.  We
5223        // disable it here, but selectively enable it later (via
5224        // StrictMode) on debug builds, but using DropBox, not logs.
5225        CloseGuard.setEnabled(false);
5226        // 初始化应用中需要使用的系统路径
5227        Environment.initForCurrentUser();
5228
5229        // Set the reporter for event logging in libcore
5230        EventLogger.setReporter(new EventLoggingReporter());
5231        //增加一个保存key的provider
5232        Security.addProvider(new AndroidKeyStoreProvider());
5233
5234        // Make sure TrustedCertificateStore looks in the right place for CA certificates//为应用设置当前用户的CA证书保存的位置
5235        final File configDir = Environment.getUserConfigDirectory(UserHandle.myUserId());
5236        TrustedCertificateStore.setDefaultUserDirectory(configDir);
5237        //设置进程的名称
5238        Process.setArgV0("<pre-initialized>");
5239
5240        Looper.prepareMainLooper();
5241        //创建ActivityThread 对象
5242        ActivityThread thread = new ActivityThread();
5243        thread.attach(false);
5244
5245        if (sMainThreadHandler == null) {
5246            sMainThreadHandler = thread.getHandler();
5247        }
5248
5249        if (false) {
5250            Looper.myLooper().setMessageLogging(new
5251                    LogPrinter(Log.DEBUG, "ActivityThread"));
5252        }
5253       //开启消息循环
5254        Looper.loop();
5255
5256        throw new RuntimeException("Main thread loop unexpectedly exited");
5257    }主要的操作:如上图 ,创建线程,获取主线程handler并开启消息循环 ;thread.attach(false)方法做了啥?private void attach(boolean system, long startSeq) {................................if (!system) {..............//把对象mAppThread(Binder)放到了RuntimeInit类中的静态变量mApplicationObject中。  RuntimeInit.setApplicationObject(mAppThread.asBinder());final IActivityManager mgr = ActivityManager.getService();//AMStry {//mgr.attachApplication(mAppThread, startSeq);//将mAppThread作为参数传入AMS从而调用接口方法} catch (RemoteException ex) {throw ex.rethrowFromSystemServer();}.......................

A: mAppThread是ActivityThread的变量final ApplicationThread mAppThread = new ApplicationThread();ApplicationThread是ActivityThread和AMS交互的中间桥梁。
这也是为什么线程无限循环无消息时主线程为什么不会堵塞的原因。对于线程即是一段可执行的代码,当可执行代码执行完成后,线程生命周期便该终止了,线程退出,保持线程一直运行的方法只能是开启while循环,而没有消息时线程会进入休眠状态,只能依靠新的线程来处理事务,所以Looper.loop()并不会导致主线程的堵塞卡顿,在控件的生命周期中调用耗时操作才有引起卡顿的可能。

B: ApplicationThread 和ActivityThread之间的联系是通过Handler,ActivityThread的变量final H mH = new H(); 私有内部类H继承自Handler,是主线程的handler,处理一些消息事务。
Handler内部截图

在这里插入图片描述
在这里插入图片描述

 H类对消息事务做了明确的分类和相应的处理,这些命名handle***()的函数。

关于ApplicationThread:
是ActivityThread的私有变量,也是一个Binder对象,ApplicationThread是Client端的Binder,里面有操作scheduleXX方法处理四大组件的生命周期方法,所以AMS(AMS是Android系统最为核心的服务之一,其职责包括四大核心组件与进程的管理)服务想要调用启动组件,那就必须持有ApplicationThread的实例,如调用ApplicationThread的scheduleLaunchActivity方法,最后在scheduleLaunchActivity方法中sendMessage方法发送消息,ActivityThread中处理消息。
API:28
在这里插入图片描述
3.简述Activity的启动:
分为两种根Activity和普通Activity,根Ay设计进程的创建,如下图:
在这里插入图片描述

首先Launcher进程向AMS请求创建根Activity,AMS会判断根Activity所需的应用程序进程是否存在并启动,如果不存在就会请求Zygote进程创建应用程序进程。应用程序进程启动后,AMS会请求应用程序进程创建并启动根Activity。
普通的Activity启动:
在这里插入图片描述
在应用程序进程中的Activity向AMS请求创建普通Activity(步骤1),AMS会对 这个Activty的生命周期管和栈进行管理,校验(AndroidManifest.xml注册文件声明、启动权限)Activity等等。如果Activity满足AMS的校验,(判断进程存在)AMS就会请求应用程序进程中的ActivityThread去创建并启动普通Activity。

在这里插入图片描述


http://chatgpt.dhexx.cn/article/2NDYWEab.shtml

相关文章

一文读懂ActivityThread

ActivityThread是什么&#xff0c;是主线程吗&#xff1f;它是如何被创建的&#xff0c;以及它的作用又是什么呢&#xff1f;带着这些问题&#xff0c;我们一起来分析下ActivityThread。 全文分为以下几个部分&#xff0c;大家可根据需求阅读 文章目录 ActivityThread是什么Act…

Android ActivityThread(主线程或UI线程)简介

1. ActivityThread功能 它管理应用进程的主线程的执行(相当于普通Java程序的main入口函数)&#xff0c;并根据AMS的要求&#xff08;通过IApplicationThread接口&#xff0c;AMS为Client、ActivityThread.ApplicationThread为Server&#xff09;负责调度和执行activities、broa…

ActivityThread的理解和APP的启动过程

ActivityThread的理解和APP的启动过程 ActivityThreadActivityThread的初始化主线程Looper的初始化主线程Handler的初始化ApplicationThread及Activity的创建和启动 APP的启动系统的启动过程APP的启动过程APP启动过程的部分代码思考 总结 ActivityThread ActivityThread就是我…

validate中remote返回函数中+号导致submitHandler无法执行

validate中remote返回函数中号导致submitHandler无法执行 这是2017年以来我遇到的最无语的bug&#xff0c;现在暂时还没想到原因&#xff0c;但是这个错误真的很无语。 这是我的validate中rule的定义&#xff0c;其中 new Date; 采用至慕课网上validate插件视频中的例子。 rul…

jQuery(六)插件、Validate验证提交表单、submitHandler、更改错误信息显示的位置、required、Validator、内置验证方式表、validate ()的可选项汇总

jQuery&#xff08;六&#xff09;插件、Validate验证提交表单、submitHandler、更改错误信息显示的位置、required、Validator、内置验证方式表、validate ()的可选项汇总 文章目录 jQuery&#xff08;六&#xff09;插件、Validate验证提交表单、submitHandler、更改错误信息…

ajax post 不起作用,jQuery验证submitHandler在$ .ajax post表单数据中不起作用

我使用$.ajax发送数据并使用jQuery验证插件进行验证&#xff0c;如下所示&#xff1a; Send JS&#xff1a; jQuery(document).ready(function ($) { $(#myform).validate({ rules: { name: { required: true, rangelength: [4, 20], }, }, submitHandler: function (form) { $…

FileReader()用法

FileReader()用法HTML5定义了FileReader作为文件API的重要成员用于读文件&#xff0c;根据W3C的定义&#xff0c;FileReaderr接口提供了读取文件的方法和包含读取 结果的事件模型。 FileReader的方法使用比较简单&#xff0c;可以按照以下步骤创建FileReader对象并调用其他的方…

read/write/fsync与fread/fwrite/fflush的关系和区别

read/write/fsync&#xff1a; 1. linux底层操作&#xff1b; 2. 内核调用&#xff0c; 涉及到进程上下文的切换&#xff0c;即用户态到核心态的转换&#xff0c;这是个比较消耗性能的操作。 fread/fwrite/fflush&#xff1a; 1. c语言标准规定的io流操作&#xff0c;建立…

FileReader详解

我在Google Chrome Web Store上发布了一个案例hahaOCR&#xff0c;该扩展程序可以帮助用户识别出图片中的文字信息&#xff0c;并以文本形式显示&#xff0c;大家可以在chrome网上应用商店中找到我发布的应用程序&#xff0c;如图所示&#xff1a; 图1 - hahaOCR 该扩展程序支持…

f.readlines()

f.readlines() ftext open(1299_wangyifei_edit.pinyin, r, encodingutf-8)lines ftext.readlines()print("lines",lines)l ftext.readlines()print("l",l)输出结果&#xff1a; 原因&#xff1a; readlines() 方法用于读取所有行(直到结束符 EOF)并返…

FileReader的用法

FileReader是一种异步文件读取机制&#xff0c;结合input:file可以很方便的读取本地文件。 input:file input的file类型会渲染为一个按钮和一段文字。点击按钮可打开文件选择窗口&#xff0c;文字表示对文件的描述&#xff08;大部分情况下为文件名&#xff09;&#xff1b;…

【原创】通过 ioctl + FIONREAD 判定数据可读

【原创】通过 ioctl FIONREAD 判定数据可读 摩云飞 2016-05-12 09:57:51 浏览470 评论0 libevent ioctl FIONREAD 摘要&#xff1a; 在排查业务 bug 的过程中&#xff0c;看到如下两种输出信息&#xff1a; TCP 连接正常情况下&#xff0c;进行数据读取 14:00:38 epoll_ctl…

fread函数详解

文章迁移&#xff1a; fread函数详解 - 码到城攻fread函数详解&#xff0c;C函数使用注意事项&#xff0c;freadhttps://www.codecomeon.com/posts/93/ 函数原型&#xff1a; size_t fread( void *buffer, size_t size, size_t count, FILE *stream ) buf…

SQLSTATE: Insert value list does not match column list: 1136 Column count doesn‘t match value count

使用thinkphp5的insertAll的批量新增函数&#xff0c;提示SQLSTATE[21S01]: Insert value list does not match column list: 1136 Column count doesnt match value count at row 2 其意思就是&#xff1a;在第二行数据开始&#xff0c;插入的&#xff0c;每行数据的值的个数和…

Column-Stores vs. Row-Stores: How Different Are They Really

概述 从论文的标题可以看出这篇论文不是陈述一种新的技术、架构&#xff0c;而更偏议论文一点&#xff0c;它主要的目的在于搞清楚对于分析类的查询为什么Column-Store比Row-Store好那么多&#xff1f;好在哪里&#xff1f;一般认为原因是: 分析类查询往往只查询一个表里面很少…

Android应用开发之( TableLayout中stretchColumns、shrinkColumns的用法)

从字面上来看&#xff0c;TableLayout也比较简单&#xff0c;关键是要对相关的属性要熟悉&#xff0c;先看一个简单的例子&#xff08;后面为效果图&#xff09;&#xff1a; <?xml version"1.0" encoding"utf-8"?> <TableLayout xmlns:android…

CollenctionList

1.Collection集合 1.1集合体系结构【记忆】 集合类的特点 提供一种存储空间可变的存储模型&#xff0c;存储的数据容量可以随时发生改变 集合类的体系图 1.2Collection集合概述和基本使用【应用】 Collection集合概述 是单例集合的顶层接口&#xff0c;它表示一组对象&#xff…

输入界面,关于stretchColumns和selectAllOnFocus的属性设置

这是整个TableLayout的代码&#xff1a; <TableLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.com/tools"android:orientation"vertical"android:layout_width"fill_parent&qu…

android:stretchcolumns=0,1,2,3,stretch_stretch是什么意思

stretch是什么意思 stretch是伸展、可伸缩的意思。具体释义如下&#xff1a; stretch英 [stretʃ] 美 [strɛtʃ] 1、动词 v.伸展;延伸;持续;包括 例&#xff1a;It is better to stretch the tight muscles first 最好先伸展一下僵硬的肌肉。 2、名词 n.伸展;弹性;一片;一…

StretchBlt()函数使用

StretchBlt函数从源矩形中复制一个位图到目标矩形&#xff0c;必要时按目前目标设备设置的模式进行图像的拉伸或压缩。 说白了功能就是缩放。 函数原型如下 函数原型&#xff1a;BOOL StretchBlt(HDC hdcDest, int nXOriginDest, int nYOriginDest, int nWidthDest, int nHeig…