android工作机制和内核,android内核剖析学习笔记:AMS(ActivityManagerService)内部原理和工作机制...

一、ActivityManagerService提供的主要功能:

(1)统一调度各应用程序的Activity

(2)内存管理

(3)进程管理

二、启动一个Activity的方式有以下几种:

(1)在应用程序中调用startActivity启动指定的Activity

(2)在Home程序中单击一个应用图标,启动新的Activity

(3)按“Back”键,结束当前Activity,返回到上一个Activity

(4)长按“Home”键,显示出当前正在运行的程序列表,从中选择一个启动

这四种启动方式的主体处理流程都会按照第一种启动方式运行,后面三种方式只是在前端消息处理上各有不同。

三、进程数据类ProcessRecord

该类的源代码在~\frameworks\base\services\java\com\android\server\am路径下。

一般情况下,一个APK文件运行时会对应一个进程,ProcessRecord用来记录一个进程中的相关信息,主要包含的变量有:

(1)进程文件信息:与该进程对应的APK文件的内部信息,如

final ApplicationInfo info; // all about the first app in the process

final String processName;   // name of the process

final ArrayMap pkgList

= new ArrayMap();   //保存进程中所有APK文件包名

(2)进程的内存状态信息:用于Linux系统的out of memory(OOM)情况的处理,当发生内存紧张时,Linux系统会根据进程的内存状态信息杀掉低优先级的进程,包括的变量有

int maxAdj;                 // Maximum OOM adjustment for this process

int curRawAdj;              // Current OOM unlimited adjustment for this process

int setRawAdj;              // Last set OOM unlimited adjustment for this process

int curAdj;                 // Current OOM adjustment for this process

int setAdj;                 // Last set OOM adjustment for this process

变量中Adj的含义是调整值(adjustment)

(3)进程中包含的Activity、Provider、Service等,如下

final ArrayList activities = new ArrayList();

final ArraySet services = new ArraySet();

final ArraySet executingServices = new ArraySet();

final ArraySet connections = new ArraySet();

final ArraySet receivers = new ArraySet();

final ArrayMap

pubProviders = new ArrayMap

ContentProviderRecord>();

final ArrayList conProviders = new ArrayList();

四、ActivityRecord数据类(Android 2.3以前版本叫HistoryRecord类)

ActivityManagerService使用ActivityRecord数据类来保存每个Activity的信息,ActivityRecord类基于IApplicationToken.Stub类,也是一个Binder,所以可以被IPC调用。

主要包含的变量有:

(1)环境信息:Activity的工作环境,比如进程名称、文件路径、数据路径、图标、主题等,这些信息一般是固定的,比如以下变量

final String packageName; // the package implementing intent's component

final String processName; // process where this component wants to run

final String baseDir;   // where activity source (resources etc) located

final String resDir;   // where public activity source (public resources etc) located

final String dataDir;   // where activity data should go

int theme;              // resource identifier of activity's theme.

int realTheme;          // actual theme resource we will use, never 0.

(2)运行状态数据信息:如idle、stop、finishing等,一般为boolean类型,如下

boolean haveState;      // have we gotten the last activity state?

boolean stopped;        // is activity pause finished?

boolean delayedResume;  // not yet resumed because of stopped app switches?

boolean finishing;      // activity in pending finish list?

boolean configDestroy;  // need to destroy due to config change?

五、TaskRecord类

ActivityManagerService中使用任务的概念来确保Activity启动和退出的顺序。

TaskRecord中的几个重要变量如下:

final int taskId;       // 每个任务的标识.

Intent intent;          // 创建该任务时对应的intent

int numActivities;   //该任务中的Activity数目

final ArrayList mActivities = new ArrayList();  //按照出现的先后顺序列出该任务中的所有Activity

六、ActivityManagerService中一些重要的与调度相关的变量

(1)记录最近启动的Activity,如果RAM容量较小,则记录的最大值为10个,否则为20个,超过该值后,Ams会舍弃最早记录的Activity

static final int MAX_RECENT_TASKS = ActivityManager.isLowRamDeviceStatic() ? 10 : 20;

(2)当Ams通知应用程序启动(Launch)某个Activity时,如果超过10s,Ams就会放弃

static final int PROC_START_TIMEOUT = 10*1000;

(3)当Ams启动某个客户进程后,客户进程必须在10s之内报告Ams自己已经启动,否则Ams会认为指定的客户进程不存在

static final int PROC_START_TIMEOUT = 10*1000;

(4)等待序列:

当Ams内部还没有准备好时,如果客户进程请求启动某个Activity,那么会被暂时保存到该变量中,

final ArrayList mPendingActivityLaunches

= new ArrayList();

(5)优先启动,其次再停止。进程A1包含两个Activity,启动顺序为A1->A2,当用户请求启动A2时,如果A1正在运行,Ams会先暂停A1,然后启动A2,当A2启动后再停止A1。

private final ArrayList mRecentTasks = new ArrayList();

七、startActivity()的流程

当用户单击某个应用图标后,执行程序会在该图标的onClick()事件中调用startActivity()方法,该方法会调用

startActivityForResult(),在这个方法内部会调用Instrumentation对象的

executeStartActivity()方法,每个Activity内部都有一个Instrumentation对象的引用,它就是一个管

家,ActivityThread要创建或者暂停某个Activity都是通过它实现的。

流程图如下所示:

61503516_1

下面附上ActivityManagerService的完整源代码,有兴趣的童鞋可以深入研究。

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

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

相关文章

从.Net到Java学习第四篇——spring boot+redis

从.Net到Java学习系列目录 “学习java已经十天,有时也怀念当初.net的经典,让这语言将你我相连,怀念你......”接上一篇,本篇使用到的框架redis、FastJSON。 环境准备 安装redis,下图是我本机的redis绿色版,…

hdu 4409 Family Name List LCA +stl

http://acm.hdu.edu.cn/showproblem.php?pid4409 赛后才过只能说悲剧了,知道思路,stl不熟悉,所以导致写的很慢....占据了很多时间,手速代码准确度。。哎。。。 题意: 给你一个家谱,n个人的姓名&#xff0c…

mysql杂记

1、 mysql安装完成后需要将mysql里面的bin目录加到环境变量里之后,才能在cmd窗口里使用mysql命令 2、 在CMD命令窗口敲入命令 mysql -hlocalhost -uroot -ppassword进入mysql数据库 这里我的用户名是root,密码是123456 转载于:https://www.cnblogs.com/y…

vue created 生命周期

在实例创建完成后被立即调用。在这一步,实例已完成以下的配置:数据观测 (data observer),属性和方法的运算,watch/event 事件回调。然而,挂载阶段还没开始,$el属性目前不可见。 methods、data、watch等可以…

android cne服务,Android内存优化-了解内存篇

查看系统内存文件shellaries:/ $ cat /proc/meminfoMemTotal: 1970216 kBMemFree: 83756 kBBuffers: 156020 kBCached: 702516 kBSwapCached: 0 kBActive: 1160284 kBInactive: 397932 kBActive(anon): 778932 kBInactive(anon): 2228 kBActive(file): 381352 kBInactive(file)…

Shell中的特殊字符

通配符 当需要用命令处理一组文件,例如file1.txt、file2.txt、file3.txt……,用 户不必一一输入文件名,可以使用Shell通配符。Shell命令的通配符含义如下表 引号 在 Shell 中引号分为 2 种:单引号、双引号。 ( 1 &…

android的帧布局,七、Android帧布局FrameLayout和霓虹灯效果

帧布局容器为每个加入其中的组件创建一个空白的区域(称为一帧),所有每个子组件占据一帧,这些帧都会根据gravity属性执行自动对齐。FrameLayout的常用XML属性和相关方法XML属性相关方法说  明android:foregroundsetForeground(Drawable)设置该帧布局容器…

flutter能开发游戏吗_Steam上架游戏开发软件,不用代码也能制作游戏,而且还是免费的...

时代在变化,科技在进步,曾几何时我们一度以为的高科技,在现在看来也不过是平常到不能再平常的东西。游戏开发也一样,以前需要代码才能开发制作而成,现如今都不需要了,直接编辑就OK,Steam商城这次…

快速构建Windows 8风格应用10-设备方向

本篇博文主要介绍常用支持Windows 8操作系统设备的方向、如何获取当前设备方向、DisplayProperties类 常用支持Windows 8操作系统设备的方向在我们常用的设备当中,Windows 8是通过什么来监控设备方向呢?答案是方向传感器,那么对于设备的不同方…

CSDN怎么转载别人的博客

参考:CSDN怎么转载别人的博客 作者:zhongjianblackberry 发布时间:2018-03-06 11:57:59 网址:https://blog.csdn.net/zhongjianblackberry/article/details/79456338 目录转载CSDN博客步骤:Markdown和HTML相关小知识Ma…

青岛西海岸惠普大数据_青岛西海岸新区用好卫星大数据 为城市治理全面赋能...

来源:环球网为推进城市治理数字化程度,提升城市治理的智能化和精细化水平,青岛西海岸新区搭建了人工智能搜索视觉分析平台,以月度更新的频率,汇聚了新区0.5米高分辨率卫星影像数据,通过数据资源共享系统为各…

总结jenkins Android自动打包遇到的坑

一、ndk-build报错 [roothejianlai-jenkins LearnGradle]# ndk-build /usr/local/android-ndk-r8/ndk-build: /usr/local/android-ndk-r8/prebuilt/linux-x86/bin/make: /lib/ld-linux.so.2: bad ELF interpreter: No such file or directory 解决方法:安装glibc.i6…

android的热修复,Android热修复原理

热修复框架技术主要有三类,代码修复,资源修复,动态链接库修复。资源修复很多资源修复的框架参考了Instant Run资源修复的原理,所以先了解一下Instant RunInstant RunInstant Run是Android Studio 2.0以后新增的一个运行机制&#…

树莓派的四种登陆方式

参考:树莓派的4种登陆方式 作者:丶PURSUING 发布时间:2021-02-02 09:15:30 网址:https://blog.csdn.net/weixin_44742824/article/details/113524929?spm1001.2014.3001.5502 目录一、HDMI视频线二、串口1.修改sd卡中的系统文件2…

丰收互联蓝牙key怎么开机_ublox收购Rigado的蓝牙模块业务,扩大蓝牙低功耗产品组合...

全球领先的定位与无线通讯技术供应商u-blox 宣布,已与 Rigado签署资产购买协议,收购其蓝牙模块业务。Rigado是商业物联网Edge-as-a-Service(EaaS)边缘即服务网关解决方案的领先供应商,于2015年开始提供通过认证的无线模块。强化蓝牙产品系列此…

好的编程风格

1。关键字 if, while, for 后有一个空格 2。号之类的双目运算符两侧都有空格 3。后缀运算符和操作数之间不加空格 例如 s.a , foo(argu) , a[i] 4。, 号和 ; 号之后要加空格&#xff0c;例如 foo(argu1, argu2) for (i0; i<20; i) 5。关于双目运算符两侧加空格可以灵活规定&…

android 时间戳 时区,三句话理解时区与时间戳

从不浪费时间的人&#xff0c;没有工夫抱怨时间不够。 —— 杰弗逊第一句话&#xff1a;时间戳时间不分东西南北、在地球的每一个角落都是相同的。他们都有一个相同的名字&#xff0c;叫时间戳。时间戳 指的就是Unix时间戳(Unix timestamp)。它也被称为Unix时间(Unix time)、PO…

windows下的diskpart指令彻底格式化清除U盘

参考&#xff1a;windows下的diskpart指令修复U盘分区 作者&#xff1a;丶PURSUING 发布时间&#xff1a;2021-02-02 09:38:55 网址&#xff1a;https://blog.csdn.net/weixin_44742824/article/details/113537038?spm1001.2014.3001.5501 参考&#xff1a;原文链接 作者&…

简述控制反转ioc_讲一下你理解的 DI 、IoC、DIP ?

作者 | 木小楠链接 |cnblogs.com/liuhaorain/p/3747470.html摘要面向对象设计(OOD)有助于我们开发出高性能、易扩展以及易复用的程序。其中&#xff0c;OOD有一个重要的思想那就是依赖倒置原则(DIP)&#xff0c;并由此引申出IoC、DI以及Ioc容器等概念。本文我们将一起学习这些概…

html模糊遮罩层磨砂玻璃,常见的PPT背景:如何设计PPT背景?

第一种&#xff1a;纯色背景纯色背景分为两类&#xff0c;一种为黑白灰等“无色”背景&#xff0c;另一种就是彩色背景。黑白灰等无色背景&#xff0c;是安全的背景&#xff0c;容易配色&#xff0c;所以在使用上最多&#xff0c;如果没有色彩基础的朋友&#xff0c;建议还是用…