AMS重要的数据结构解析(一):ActivityRecord,网易Android面试必问

boolean componentSpecified, ActivityRecord[] outActivity, ActivityContainer container,

TaskRecord inTask) {

ActivityRecord r = new ActivityRecord(mService, callerApp, callingUid, callingPackage,

intent, resolvedType, aInfo, mService.mConfiguration, resultRecord, resultWho,

requestCode, componentSpecified, this, container, options);

err = startActivityUncheckedLocked(r, sourceRecord, voiceSession, voiceInteractor,

startFlags, true, options, inTask);

}

ActivityRecord( ActivityManagerService _service,

ProcessRecord _caller, //调用者的进程,与aInfo一起来决定当前Activity的应用包名

int _launchedFromUid, //启动Activity的Uid

String _launchedFromPackage, //启动Activity的包名

Intent _intent, //启动的Intent

String _resolvedType, //调用的包名

ActivityInfo aInfo, //Activity的信息

Configuration _configuration, //Activity的配置信息

ActivityRecord _resultTo, //parent Activity的信息

String _resultWho, //parent Activity的包名

int _reqCode, //startActivityForResult中的RequestCode

boolean _componentSpecified, //boolean componentSpecified = intent.getComponent() != null;

ActivityStackSupervisor supervisor,

ActivityContainer container, //大多数为null,一些特殊的启动方式会有值.

Bundle options)

然后就会传入到我们启动Activity的过程,

Step 2 :ActivityStackSupervisor.java

    final int startActivityUncheckedLocked(ActivityRecord r, ActivityRecord sourceRecord,



IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor, int startFlags,



boolean doResume, Bundle options, TaskRecord inTask) {











if (r.resultTo == null && inTask == null && !addingToTask







&& (launchFlags & Intent.FLAG_ACTIVITY_NEW_TASK) != 0) {



newTask = true;



targetStack = adjustStackFocus(r, newTask);                                           //这一步相当于找到Activity所在的栈,下一部是移动的操作



if (!launchTaskBehind) {



targetStack.moveToFront("startingNewTask");                                       //将当前的ActivityStack从栈里移到栈顶。



}



if (reuseTask == null) {



r.setTask(targetStack.createTaskRecord(getNextTaskId(),                           //这里是创建一个新的Task,作为要启动的Activity所在的栈,这里有一个唯一的TaskId标识,方法是每次id++查找一遍,如果已经存在则再++查找,感觉这里效率是可以优化的。geNextTaskId()在Step 3中,感兴趣的可以提出优化方法一起讨论一下。



newTaskInfo != null ? newTaskInfo : r.info,



newTaskIntent != null ? newTaskIntent : intent,



voiceSession, voiceInteractor, !launchTaskBehind /* toTop */),



taskToAffiliate);



if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r + " in new task " +



r.task);



}



} else if (sourceRecord != null) {



......										//这里过程类似,省略掉



} else if (inTask != null) {



......



} else {



// This not being started from an existing activity, and not part



// of a new task...  just put it in the top task, though these days



// this case should never happen.



targetStack = adjustStackFocus(r, newTask);



targetStack.moveToFront("addingToTopTask");



ActivityRecord prev = targetStack.topActivity();



r.setTask(prev != null ? prev.task : targetStack.createTaskRecord(getNextTaskId(),                     //这里则是另一种情况,新启动的Activity与之前的Activity公用一个栈。



r.info, intent, null, null, true), null);



mWindowManager.moveTaskToTop(r.task.taskId);



if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r







+ " in new guessed " + r.task);



}







**Step 3 [ActivityStackSupervisor.java]( )**





int getNextTaskId() {



do {



mCurTaskId++;



if (mCurTaskId <= 0) {



mCurTaskId = 1;



}



} while (anyTaskForIdLocked(mCurTaskId) != null);



return mCurTaskId;



}

TaskRecord anyTaskForIdLocked(int id) {



int numDisplays = mActivityDisplays.size();



for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {



ArrayList stacks = mActivityDisplays.valueAt(displayNdx).mStacks;



for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {



ActivityStack stack = stacks.get(stackNdx);



TaskRecord task = stack.taskForIdLocked(id);



if (task != null) {



return task;



}



}



}











// Don't give up! Look in recents.



if (DEBUG_RECENTS) Slog.v(TAG, "Looking for task id=" + id + " in recents");



TaskRecord task = mService.recentTaskForIdLocked(id);



if (task == null) {



if (DEBUG_RECENTS) Slog.d(TAG, "\tDidn't find task id=" + id + " in recents");



return null;



}











if (!restoreRecentTaskLocked(task)) {



if (DEBUG_RECENTS) Slog.w(TAG, "Couldn't restore task id=" + id + " found in recents");



return null;



}



if (DEBUG_RECENTS) Slog.w(TAG, "Restored task id=" + id + " from in recents");



return task;



}









**Step 4 : [ActivityStack.java]( )**





final void startActivityLocked(ActivityRecord r, boolean newTask,







boolean doResume, boolean keepCurTransition, Bundle options) {







TaskRecord rTask = r.task;







final int taskId = rTask.taskId;







// mLaunchTaskBehind tasks get placed at the back of the task stack.







if (!r.mLaunchTaskBehind && (taskForIdLocked(taskId) == null || newTask)) {







// Last activity in task had been removed or ActivityManagerService is reusing task.







// Insert or replace.







// Might not even be in.







insertTaskAtTop(rTask);                                                       		//对于新栈,直接插入就好,







mWindowManager.moveTaskToTop(taskId);







}







TaskRecord task = null;




**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**

**深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**

**因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**

![img](https://img-blog.csdnimg.cn/img_convert/72c063858b1bfefa34d11e1faf4cf663.png)

![img](https://img-blog.csdnimg.cn/img_convert/628abd0dbef16d566822b6552bb59851.png)

![img](https://img-blog.csdnimg.cn/img_convert/fea2ec4b70690b39fce68783b7e2639d.png)

![img](https://img-blog.csdnimg.cn/img_convert/47612e885864da7f6aaff821f40ebed5.png)

![](https://img-blog.csdnimg.cn/img_convert/5fc1545c2fd7974b8edd0d097b4ec2a7.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!**

**由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!**

**如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)**






### 尾声

评论里面有些同学有疑问关于如何学习material design控件,我的建议是**去GitHub搜**,有很多同行给的例子,这些栗子足够入门。

有朋友说要是动真格的话,需要NDK以及JVM等的知识,首现**NDK并不是神秘的东西,**你跟着官方的步骤走一遍就知道什么回事了,**无非就是一些代码格式以及原生/JAVA内存交互,进阶一点的有原生/JAVA线程交互,线程交互确实有点蛋疼,但平常避免用就好了,再说对于初学者来说关心NDK干嘛,据鄙人以前的经历,只在音视频通信和一个嵌入式信号处理(离线)的两个项目中用过,嵌入式信号处理是JAVA->NDK->.SO->MATLAB这样调用的我原来MATLAB的代码,其他的大多就用在游戏上了吧,一般的互联网公司会有人给你公司的SO包的。**
**至于JVM,该掌握的那部分,相信我,你会掌握的,不该你掌握的,有那些专门研究JVM的人来做,不如省省心有空看看计算机系统,编译原理。**

**一句话,平常多写多练,这是最基本的程序员的素质,尽量挤时间,读理论基础书籍,JVM不是未来30年唯一的虚拟机,JAVA也不一定再风靡未来30年工业界,其他的系统和语言也会雨后春笋冒出来,但你理论扎实会让你很快理解学会一个语言或者框架,你平常写的多会让你很快熟练的将新学的东西应用到实际中。**
**初学者,一句话,多练。**


**《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》[点击传送门即可获取!](https://bbs.csdn.net/forums/f76c2498e3b04ae99081eaf6e6cf692c)**

关于如何学习material design控件,我的建议是**去GitHub搜**,有很多同行给的例子,这些栗子足够入门。

有朋友说要是动真格的话,需要NDK以及JVM等的知识,首现**NDK并不是神秘的东西,**你跟着官方的步骤走一遍就知道什么回事了,**无非就是一些代码格式以及原生/JAVA内存交互,进阶一点的有原生/JAVA线程交互,线程交互确实有点蛋疼,但平常避免用就好了,再说对于初学者来说关心NDK干嘛,据鄙人以前的经历,只在音视频通信和一个嵌入式信号处理(离线)的两个项目中用过,嵌入式信号处理是JAVA->NDK->.SO->MATLAB这样调用的我原来MATLAB的代码,其他的大多就用在游戏上了吧,一般的互联网公司会有人给你公司的SO包的。**
**至于JVM,该掌握的那部分,相信我,你会掌握的,不该你掌握的,有那些专门研究JVM的人来做,不如省省心有空看看计算机系统,编译原理。**

**一句话,平常多写多练,这是最基本的程序员的素质,尽量挤时间,读理论基础书籍,JVM不是未来30年唯一的虚拟机,JAVA也不一定再风靡未来30年工业界,其他的系统和语言也会雨后春笋冒出来,但你理论扎实会让你很快理解学会一个语言或者框架,你平常写的多会让你很快熟练的将新学的东西应用到实际中。**
**初学者,一句话,多练。**


**《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》[点击传送门即可获取!](https://bbs.csdn.net/forums/f76c2498e3b04ae99081eaf6e6cf692c)**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值